流量控制运算符
流量控制运算符
| 名称 | 描述 |
|---|---|
CASE | 案例运算符 |
IF() | 如果/其他构造 |
IFNULL() | 空if / else构造 |
NULLIF() | 如果expr1 = expr2,则返回NULL |
CASEvalueWHEN[compare_value] THENresult[WHEN[compare_value] THENresult...][ELSEresult] ENDCASE WHEN[condition] THENresult[WHEN[condition] THENresult...][ELSEresult] END第一种
CASE语法返回的result第一个比较结果为true。第二种语法返回第一个条件为true的结果。如果没有比较或条件为真,则返回after的结果,或者不存在任何结果。value=compare_valueELSENULLELSE注意
此处描述的expr的语法与“ CASE语句”中描述的SQL 语句的语法略有不同,该语句在存储程序内部使用。该语句不能有子句,并且以代替。
CASECASECASEELSE NULLEND CASEENDCASE表达式结果的返回类型是所有结果值的汇总类型:如果所有类型均为数字,则聚合类型也为数字:
- 如果至少一个参数为双精度,则结果为双精度。
- 否则,如果至少一个参数为
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 1WHEN 1THEN 'one' ->WHEN 2THEN 'two'ELSE 'more'END ; -> 'one' mysql>SELECT CASEWHEN 1>0THEN 'true'ELSE 'false'END ; -> 'true' mysql>SELECT CASE BINARY 'B' ->WHEN 'a'THEN 1WHEN 'b'THEN 2END ; -> NULLIF(expr1,expr2,expr3)如果
expr1isTRUE(expr1<> 0和expr1<> NULL),则IF()返回expr2。否则,返回expr3。注意
还有一条语句,与此处描述的功能不同。请参见“ IF语句”。
IFIF()如果
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)STRINGREALINTEGERIFNULL()mysql>
CREATE TABLE tmpSELECT 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= expr2expr1CASE WHEN expr1= expr2 THEN NULL ELSE expr1 END返回值的类型与第一个参数相同。
mysql>
SELECT NULLIF(1,1); -> NULL mysql>SELECT NULLIF(1,2); -> 1注意
expr1如果参数不相等, MySQL会计算两次。
