条件表达式

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;

NULLIF ()

除了以上两种形式的 CASE 表达式之外,SQL 还定义了两个与 NULL 值相关的缩写 CASE 表达式(函数):nullifcoalesce

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 的结果。

参考:

https://www.cnblogs.com/xiaohuochai/p/6081482.html

Update time: 2020-08-18

results matching ""

    No results matching ""