SQL 中的条件表达式
SQL 是一种声明性的语言,它没有提供其他编程语言中的条件语句(if-then-else 或者 switch)。但是,SQL 支持 CASE 表达式,可以基于一个条件列表返回不同的结果值,它更像是一种支持嵌套的三元表达式(? :)。
CASE 表达式支持两种形式:简单 CASE 表达式和搜索 CASE 表达式。另外,还存在一些简写形式的 CASE 函数,以及不同数据库产品特有的扩展。
简单 CASE 表达式
简单 CASE 表达式的语法如下:
CASE expression
WHEN expression_1 THEN result_1
WHEN expression_2 THEN result_2
...
[ELSE default_result]
END
简单 CASE 表达式比较CASE
后的表达式与WHEN
列表中的表达式的值,找到第一个匹配的值(=),返回后面相应的结果;如果没有匹配值,返回ELSE
子句的值;如果此时没有指定ELSE
子句,返回空值。
示例
SELECT e.first_name,
e.last_name,
e.job_id,
CASE e.job_id
WHEN 'AD_PRES' THEN 'President'
WHEN 'AD_VP' THEN 'Administration Vice President'
WHEN 'IT_PROG' THEN 'Programmer'
ELSE 'Other job'
END
FROM employees e;
简单 CASE 表达式仅仅比较两个值是否相等,然后返回相应的值。如果我们想要基于更加复杂的条件进行判断,例如某个值是否为空,某个值是否大于指定的数值,甚至使用子查询的结果进行判断,都需要使用更加强大的搜索 CASE 表达式。
搜索 CASE 表达式
搜索 CASE 表达式的语法如下:
CASE
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_1
...
[ELSE default_result]
END
表达式按照顺序计算WHEN
子句中的条件,找到第一个结果为 True 的分支,返回相应的结果;如果没有任何条件为真,返回ELSE
中的默认值;如果此时没有指定ELSE
子句,返回空值。
SELECT e.first_name,
e.last_name,
e.salary,
CASE
WHEN e.salary < 5000 THEN 'Low'
WHEN e.salary < 10000 THEN 'Middle'
WHEN e.salary < 15000 THEN 'High'
ELSE 'Top'
END AS salary_level
FROM employees e;
CASE 表达式除了可以用于SELECT
列表,也可以出现在其他 SQL 子句中,例如WHERE
条件、GROUP BY
分组、ORDER BY
排序等。
SELECT CASE
WHEN e.salary < 5000 THEN 'Low'
WHEN e.salary < 10000 THEN 'Middle'
WHEN e.salary < 15000 THEN 'High'
ELSE 'Top'
END AS salary_level,
MIN(e.salary) min_salary,
MAX(e.salary) max_salary
FROM employees e
GROUP BY CASE
WHEN e.salary < 5000 THEN 'Low'
WHEN e.salary < 10000 THEN 'Middle'
WHEN e.salary < 15000 THEN 'High'
ELSE 'Top'
END;
缩写 CASE 表达式
除了以上两种形式的 CASE 表达式之外,SQL 还定义了两个与 NULL 值相关的缩写 CASE 表达式(函数):nullif 和 coalesce。
NULLIF 函数需要2个参数,如果第一个参数等于第二个参数,返回 NULL 值;否则,返回第一个参数的值:
NULLIF(expression_1, expression_2)
它的等价 CASE 表达式如下:
CASE
WHEN expression_1 = expression_2 THEN NULL
ELSE expression_1
END
NULLIF 函数的一个常见用途是防止除零错误:
value1 / NULLIF(value2 , 0)
COALESCE 函数接受一个参数列表,并且返回第一个非空的参数值;如果所有参数都为空,返回空值:
COALESCE(expression_1, expression_2, expression_3, ...)
它的等价 CASE 表达式如下:
CASE
WHEN expression_1 IS NOT NULL THEN expression_1
WHEN expression_2 IS NOT NULL THEN expression_2
WHEN expression_3 IS NOT NULL THEN expression_3
...
END
示例:
SELECT e.first_name,
e.last_name,
COALESCE(e.commission_pct, 0)
FROM employees e;
如果员工存在佣金百分比,返回该值;否则,显示为 0。
IF 函数
MySQL 提供了 IF 函数:
IF(expr1, expr2, expr3)
它接受三个参数。如果第一个参数为真(expr1 <> 0 并且 expr1 不为空),返回第二个参数的值;否则,返回第三个参数的值。
-- For MySQL only
SELECT IF(1<2, '1<2', '1>=2'), IF(NULL, 'Y', 'N');
-- result is: 1<2 N
IFNULL(expr1, expr2)
函数。它接受两个参数,如果 expr1 不为空,返回 expr1 的值;否则,返回 expr2 的值。
SELECT e.first_name,
e.last_name,
IFNULL(e.commission_pct, 0)
FROM employees e;
IFNULL函数
IFNULL
函数:判断是否为空
MySQL IFNULL 函数是 MySQL 控制流函数之一,它接受两个参数,如果不是 NULL,则返回第一个参数。 否则,IFNULL 函数返回第二个参数。两个参数可以是文字值或表达式。
函数的语法:
IFNULL(v1,v2);
其中:如果 v1 不为 NULL,则 IFNULL 函数返回 v1; 否则返回 v2 的结果。
参考: