条件表达式
PostgreSQL中可用的SQL兼容的条件表达式。
如果你的需求超过这些条件表达式的能力,你可能会希望用一种更富表现力的编程语言写一个存储过程。
CASE
SQL CASE表达式是一种通用的条件表达式,类似于其它编程语言中的 if/else 语句:
CASE WHEN condition THEN result
[WHEN …]
[ELSE result]
END
CASE子句可以用于任何表达式可以出现的地方。每一个condition是一个返回boolean结果的表达式。如果结果为真,那么CASE表达式的结果就是符合条件的result,并且剩下的CASE表达式不会被处理。如果条件的结果不为真,那么以相同方式搜寻任何随后的WHEN子句。如果没有WHEN condition为真,那么CASE表达式的值就是在ELSE子句里的result。如果省略了ELSE子句而且没有条件为真,结果为空。
-- Example:
postgres=# SELECT * FROM t_1 ORDER BY 1, 2;
num | name
-----+------
1 | a
2 | b
3 | c
4 | a
(4 rows)
postgres=# SELECT num,
postgres-# CASE num WHEN 1 THEN 'one'
postgres-# WHEN 2 THEN 'two'
postgres-# WHEN 3 THEN 'three'
postgres-# ELSE 'other'
postgres-# END
postgres-# FROM t_1
postgres-# ORDER BY 1, 2;
num | case
-----+-------
1 | one
2 | two
3 | three
4 | other
(4 rows)
所有result表达式的数据类型都必须可以转换成单一的输出类型。
COALESCE
COALESCE(value [, …])
COALESCE函数返回它的第一个非空参数的值。当且仅当所有参数都为空时才会返回空。它常用于在为显示目的检索数据时用缺省值替换空值。
--Example
postgres=# SELECT coalesce(NULL, NULL, num) FROM t_1 order by 1;
coalesce
----------
1
2
3
4
(4 rows)
和CASE表达式一样,COALESCE将不会 计算无助于判断结果的参数;也就是说,在第一个非空参数右边的参数不会被计算。这个 SQL 标准函数提供了类似于NVL和IFNULL的能力,它们被用在某些其他数据库系统中。
NULLIF
NULLIF(value1, value2)
当value1和value2相等时,NULLIF返回一个空值。 否则它返回value1。 这些可以用于执行前文给出的COALESCE例子的逆操作:
postgres=# SELECT nullif(num::text, name) FROM t_1 order by 1;
nullif
--------
1
2
3
4
(4 rows)
GREATEST和LEAST
GREATEST(value [, …])
LEAST(value [, …])
GREATEST和LEAST函数从一个任意的数字表达式列表里选取最大或者最小的数值。 这些表达式必须都可以转换成一个普通的数据类型,它将会是结果类型 。列表中的 NULL 数值将被忽略。只有所有表达式的结果都是 NULL 的时候,结果才会是 NULL。
请注意GREATEST和LEAST都不是 SQL 标准,但却是很常见的扩展。某些其他数据库让它们在任何参数为 NULL 时返回 NULL,而不是在所有参数都为 NULL 时才返回 NULL。