流量控制运算符
流量控制运算符
| 名称 | 描述 | 
|---|---|
| CASE | 案例运算符 | 
| IF() | 如果/其他构造 | 
| IFNULL() | 空if / else构造 | 
| NULLIF() | 如果expr1 = expr2,则返回NULL | 
- CASE- valueWHEN[- compare_value] THEN- result[WHEN[- compare_value] THEN- result...][ELSE- result] END- CASE WHEN[- condition] THEN- result[WHEN[- condition] THEN- result...][ELSE- result] END- 第一种 - CASE语法返回的- result第一个比较结果为true。第二种语法返回第一个条件为true的结果。如果没有比较或条件为真,则返回after的结果,或者不存在任何结果。- value=compare_value- ELSE- NULL- ELSE- 注意 - 此处描述的expr的语法与“ CASE语句”中描述的SQL 语句的语法略有不同,该语句在存储程序内部使用。该语句不能有子句,并且以代替。 - CASE- CASE- CASE- ELSE NULL- END CASE- END- CASE表达式结果的返回类型是所有结果值的汇总类型:- 如果所有类型均为数字,则聚合类型也为数字: - 如果至少一个参数为双精度,则结果为双精度。
- 否则,如果至少一个参数为DECIMAL,则结果为DECIMAL。
- 否则,结果为整数类型(一个例外): - 如果所有的整数类型都是有符号或无符号的所有的结果都是一样的符号和精度最高的所有指定整数类型的(即TINYINT,SMALLINT,MEDIUMINT,INT,或BIGINT)。
- 如果将有符号和无符号整数类型组合在一起,则结果将是有符号的,并且精度可能更高。例如,如果类型为带符号INT和无符号INT,则结果为带符号BIGINT。
- 该异常是无符号的,BIGINT与任何有符号的整数类型结合使用。结果DECIMAL具有足够的精度和小数位数为0。
 
- 如果所有的整数类型都是有符号或无符号的所有的结果都是一样的符号和精度最高的所有指定整数类型的(即
 
- 如果所有类型均为BIT,则结果为BIT。否则,BIT参数的处理类似于BIGINT。
- 如果所有类型均为YEAR,则结果为YEAR。否则,YEAR参数的处理类似于INT。
- 如果所有类型都是字符串(CHAR或VARCHAR),则结果的VARCHAR最大长度取决于操作数的最长字符长度。
- 如果所有类型均为字符或二进制字符串,则结果为VARBINARY。
- SET并且- ENUM被类似于对待- VARCHAR;结果是- VARCHAR。
- 如果所有类型均为JSON,则结果为JSON。
- 如果所有类型都是时间类型,则结果为时间类型: - 如果所有的时间类型DATE,TIME或者TIMESTAMP,其结果是DATE,TIME或TIMESTAMP分别。
- 否则,对于时间类型的混合,结果为DATETIME。
 
- 如果所有的时间类型
- 如果所有类型均为GEOMETRY,则结果为GEOMETRY。
- 如果是任何类型BLOB,则结果为BLOB。
- 对于所有其他类型组合,结果为VARCHAR。
- NULL对于类型聚合,将忽略文字操作数。
 - mysql> - SELECT CASE 1- WHEN 1- THEN 'one' ->- WHEN 2- THEN 'two'- ELSE 'more'- END ; -> 'one' mysql>- SELECT CASE- WHEN 1>0- THEN 'true'- ELSE 'false'- END ; -> 'true' mysql>- SELECT CASE BINARY 'B' ->- WHEN 'a'- THEN 1- WHEN 'b'- THEN 2- END ; -> NULL
- IF(expr1,expr2,expr3)- 如果 - expr1is- TRUE(- expr1<> 0和- expr1<> NULL),则- IF()返回- expr2。否则,返回- expr3。- 注意 - 还有一条语句,与此处描述的功能不同。请参见“ IF语句”。 - IF- IF()- 如果 - expr2或中只有一个- expr3是- NULL,则- IF()函数的结果类型为非- NULL表达式的类型。- 默认返回类型 - IF()(将其存储到临时表中时可能很重要)的计算如下:- 如果 - expr2或- expr3产生一个字符串,则结果是一个字符串。- 如果 - expr2和- expr3都是字符串,则如果其中一个字符串区分大小写,则结果区分大小写。
- 如果expr2或expr3产生浮点值,则结果为浮点值。
- 如果expr2或expr3产生整数,则结果为整数。
 - mysql> - SELECT IF(1>2,2,3); -> 3 mysql>- SELECT IF(1<2,'yes','no'); -> 'yes' mysql>- SELECT IF(STRCMP('test','test1'),'no','yes'); -> 'no'
- IFNULL(expr1,expr2)- 如果 - expr1不是- NULL,则- IFNULL()返回- expr1;否则返回- expr2。- mysql> - SELECT IFNULL(1,0); -> 1 mysql>- SELECT IFNULL(NULL,10); -> 10 mysql>- SELECT IFNULL(1/0,10); -> 10 mysql>- SELECT IFNULL(1/0,'yes'); -> 'yes'- 默认返回值类型是更为“一般”两个表达式的,顺序,或。考虑基于表达式的表的情况,或者MySQL必须在内部在临时表中存储由返回的值的情况: - IFNULL(expr1,expr2)- STRING- REAL- INTEGER- IFNULL()- mysql> - CREATE - TABLE tmp- SELECT IFNULL(1,'test')- AS test; mysql>- DESCRIBE tmp; +------- +-------------- +------ +----- +--------- +------- + | Field | Type | Null | Key | Default | Extra | +------- +-------------- +------ +----- +--------- +------- + | test | varbinary(4) | NO | | | | +------- +-------------- +------ +----- +--------- +------- +- 在此示例中, - test列的类型为- VARBINARY(4)(字符串类型)。
- NULLIF(expr1,expr2)- 返回 - NULL如果为真,否则返回。这与相同。- expr1= expr2- expr1- CASE WHEN expr1= expr2 THEN NULL ELSE expr1 END- 返回值的类型与第一个参数相同。 - mysql> - SELECT NULLIF(1,1); -> NULL mysql>- SELECT NULLIF(1,2); -> 1- 注意 - expr1如果参数不相等, MySQL会计算两次。
