多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 9.17\. 条件表达式 本节描述在PostgreSQL里可用的SQL兼容的条件表达式。 > **Tip:** 如果你的需求超过这些条件表达式的能力,你可能会希望用一种更富表现力的编程语言写一个存储过程。 ## 9.17.1\. `CASE` `CASE`表达式是一种通用的条件表达式,类似于其它编程语言中的 if/else 语句。 ``` CASE WHEN _condition_ THEN _result_ [WHEN ...] [ELSE `_result_`] END ``` `CASE`子句可以用于任何表达式可以存在的地方。`_condition_` 是一个返回`boolean`的表达式。如果条件的结果为真,那么`CASE` 表达式的结果就是符合条件的`_result_`,并且不再处理剩余的 `CASE`表达式。如果条件的结果为假,那么以相同方式搜寻任何随后的`WHEN` 子句。如果没有`WHEN` `_condition_`为真, 那么表达式的结果就是在`ELSE`子句里的`_result_`。 如果省略了`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 ``` 所有`_result_`表达式的数据的类型都必须可以转换成单一的输出类型。 参阅[Section 10.5](#calibre_link-454)获取更多细节。 下面这个"简单的"`CASE`表达式是上面的通用形式的一个特殊的变种: ``` CASE _expression_ WHEN _value_ THEN _result_ [WHEN ...] [ELSE `_result_`] END ``` 先计算`_expression_`的值,然后与每个`WHEN` 子句里声明的`_value_`表达式对比,直到找到一个相等的。 如果没有找到匹配的,则返回在`ELSE`子句里的`_result_` (或者 NULL)。这个类似于 C 里的`switch`语句。 上面的例子可以用简单`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 ``` `CASE`表达式并不计算任何对于判断结果并不需要的子表达式。比如, 下面是一个可以避免被零除的方法: ``` SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END; ``` > **Note:** 正如在[Section 35.6](#calibre_link-734)描述的那样,被`IMMUTABLE` 标记的函数和操作符在计划查询时评估,而不是在执行时。 这意味着没有在查询执行时评估的子表达式的常量部分可能仍会在查询计划时评估。 ## 9.17.2\. `COALESCE` ``` COALESCE(_value_ [, ...]) ``` `COALESCE`返回它的第一个非 NULL 的参数值。如果所有参数都是null那么返回null。 它常用于在显示数据时用缺省值替换 NULL 。比如: ``` SELECT COALESCE(description, short_description, '(none)') ... ``` 如果`description`非空那么返回它,否则如果`short_description`非空则返回它, 否则返回`(none)`。 和`CASE`表达式一样,`COALESCE`只计算需要用来判断结果的参数; 也就是说,在第一个非空参数右边的参数不会被计算。 这个符合 SQL 标准的函数提供了与某些其它数据库系统中的`NVL` 和`IFNULL`类似的功能。 ## 9.17.3\. `NULLIF` ``` NULLIF(_value1_, _value2_) ``` 当且仅当`_value1_`等于`_value2_`时, `NULLIF`才返回 null 。否则它返回`_value1_`。 这些可以用于执行上面给出的`COALESCE`例子的反例: ``` SELECT NULLIF(value, '(none)') ... ``` 在这个例子中,如果`value`是`(none)`那么返回 null,否则返回`value`。 ## 9.17.4\. `GREATEST` and `LEAST` ``` GREATEST(_value_ [, ...]) ``` ``` LEAST(_value_ [, ...]) ``` `GREATEST`和`LEAST`函数从一个任意数字表达式的列表里选取最大或者最小的数值。 这些表达式必须都可以转换成一个普通的数据类型,它将会是结果类型(参阅[Section 10.5](#calibre_link-454) 获取细节)。列表中的 NULL 值将被忽略。只有所有表达式的结果都是 NULL 的时候,结果才会是 NULL 。 请注意`GREATEST`和`LEAST`都不是 SQL 标准,但却是很常见的扩展。 某些其他的数据库在任意一个参数为NULL时返回NULL,而不是所有参数都是NULL时。