条件表达式

条件表达式包括CASE、COALESCE、NULLIF等三个表达式,由于它们的执行类似于程序设计语言中的if/else语句或switch/case语句等条件分支语句,因此称之为条件表达式。

CASE表达式

CASE表达式类似于程序设计语言中的if/else if/else语句,但功能更为强大。

CASE表达式的一种形式如下:

case ::=

CASE 子句可以用于任何表达式可以有效存在的地方。condition 是一个返回布尔型的表达式,若condition为真,那么case表达式的结果就是result;若condition为假,那么以相同方式搜寻任何随后的WHEN子句。如果没有WHEN被匹配,那么case 表达式的结果就是在ELSE子句里的值。如果省略了ELSE子句而且没有匹配的条件,则结果为NULL。

=> SELECT * FROM test;

a
---
1
2
3

=> SELECT a,
CASE WHEN a=1 THEN 'one'
WHEN a=2 THEN 'two'
ELSE 'other'
END
FROM test;

a | case
--+-------
1 | one
2 | two
3 | other

CASE表达式的另一种形式如下:

case ::=

这个"简单的" CASE 表达式是上面的通用形式的一个特殊的变种,相当于程序设计语言中的switch/case语句。这种形式的case表达式的语义是先计算 expression的值,然后与所有在WHEN子句里的value对比,若找到一个相等的,则返回对应的then子句中的表达式的值;若没有找到匹配的,则返回在 ELSE子句里的result(若没有指定ELSE子句,则返回NULL)。

如上述的例子可以用第二种CASE语法来写

=> SELECT a,
CASE a WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'other'
END
FROM test;

a | case
--+-------
1 | one
2 | two
3 | other

COALESCE表达式

COALESCE表达式返回它的第一个非NULL的参数的值,形式如下:

coalesce ::=

它常用于在为显示目的检索数据时用缺省值替换 NULL 值。比如:

CREATE TABLE manual(description VARCHAR(256), short_description
VARCHAR(256));
INSERT INTO manual VALUES('First detailed description', 'First short
description');
INSERT INTO manual VALUES (NULL, 'Second short description');
INSERT INTO manual VALUES (NULL, NULL);
SELECT COALESCE(description, short_description, '(none)') from manual;

-- 查询结果如下:
COALESCE
----------------------------
First detailed description
Second short description
(none)
(3 rows)

上述查询的含义是:若指定的详细的描述信息(description),则返回详细描述; 否则,description为NULL,coalesce表达式继续检查是否指定了简单的描述 (short_description),若已指定,则返回简单描述,否则,返回'none'。

NULLIF表达式

NULLIF表达式具有如下形式:

nullif ::=

其含义为当且仅当 value1和value2相等时,NULLIF 才返回 NULL。否则它返回value1。这些可以用于执行上面给出的 COALESCE 例子的反例:

SELECT NULLIF(description, short_description) FROM MANUAL;
+-----------------------------+
| DESCRIPTION                 |
+-----------------------------+
| First detailed description  |
|                             |
|                             |
+-----------------------------+

COALESCE和NULLIF都只是CASE表达式的缩写,如NULLIF(value1, value2)等价于:

CASE WHEN value1 = value2 THEN NULL
ELSE value1
END;

实际上它们在处理的很早的阶段转换成 CASE 表达式,然后随后的处理认为它在处理CASE。因此,错误的COALESCE 或 NULLIF 的使用可能产生一个引用CASE的错误信息.