流量控制运算符
流量控制运算符
名称 | 描述 |
---|---|
CASE | 案例运算符 |
IF() | 如果/其他构造 |
IFNULL() | 空if / else构造 |
NULLIF() | 如果expr1 = expr2,则返回NULL |
CASE
value
WHEN[compare_value
] THENresult
[WHEN[compare_value
] THENresult
...][ELSEresult
] ENDCASE WHEN[
condition
] THENresult
[WHEN[condition
] THENresult
...][ELSEresult
] 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 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)
如果
expr1
isTRUE
(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 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= 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会计算两次。