条件表达式

    条件表达式主要有以下几种:

    • CASE

      CASE表达式是条件表达式,类似于其他编程语言中的CASE语句。

      CASE表达式的语法图请参考图1

      图 1 case::=

      CASE子句可以用于合法的表达式中。condition是一个返回BOOLEAN数据类型的表达式:

      • 如果结果为真,CASE表达式的结果就是符合该条件所对应的result。
      • 如果结果为假,则以相同方式处理随后的WHEN或ELSE子句。
      • 如果各WHEN condition都不为真,表达式的结果就是在ELSE子句执行的result。如果省略了ELSE子句且没有匹配的条件,结果为NULL。

      示例:

    • DECODE

      DECODE的语法图请参见。

      图 2 decode::=
      条件表达式 - 图2

      将表达式base_expr与后面的每个compare(n) 进行比较,如果匹配返回相应的value(n)。如果没有发生匹配,则返回default。

      示例请参见条件表达式函数

      1. case
      2. ------
      3. 1
      4. (1 row)
    • COALESCE的语法图请参见。

      图 3 coalesce::=

      COALESCE返回它的第一个非NULL的参数值。如果参数都为NULL,则返回NULL。它常用于在显示数据时用缺省值替换NULL。和CASE表达式一样,COALESCE只计算用来判断结果的参数,即在第一个非空参数右边的参数不会被计算。

      示例

      1. postgres=# CREATE TABLE tpcds.c_tabl(description varchar(10), short_description varchar(10), last_value varchar(10))
      2. ;
      3. postgres=# INSERT INTO tpcds.c_tabl VALUES('abc', 'efg', '123');
      4. postgres=# INSERT INTO tpcds.c_tabl VALUES(NULL, 'efg', '123');
      5. postgres=# INSERT INTO tpcds.c_tabl VALUES(NULL, NULL, '123');
      6. postgres=# SELECT description, short_description, last_value, COALESCE(description, short_description, last_value) FROM tpcds.c_tabl ORDER BY 1, 2, 3, 4;
      7. -------------+-------------------+------------+----------
      8. abc | efg | 123 | abc
      9. | | 123 | 123
      10. (3 rows)
      11. postgres=# DROP TABLE tpcds.c_tabl;

      如果description不为NULL,则返回description的值,否则计算下一个参数short_description;如果short_description不为NULL,则返回short_description的值,否则计算下一个参数last_value;如果last_value不为NULL,则返回last_value的值,否则返回(none)。

    • NULLIF

      NULLIF的语法图请参见图4

      图 4 nullif::=
      条件表达式 - 图4

      只有当value1和value2相等时,NULLIF才返回NULL。否则它返回value1。

      示例

      1. postgres=# CREATE TABLE tpcds.null_if_t1 (
      2. NI_VALUE1 VARCHAR(10),
      3. NI_VALUE2 VARCHAR(10)
      4. );
      5. postgres=# INSERT INTO tpcds.null_if_t1 VALUES('abc', 'abc');
      6. postgres=# INSERT INTO tpcds.null_if_t1 VALUES('abc', 'efg');
      7. postgres=# SELECT NI_VALUE1, NI_VALUE2, NULLIF(NI_VALUE1, NI_VALUE2) FROM tpcds.null_if_t1 ORDER BY 1, 2, 3;
      8. ni_value1 | ni_value2 | nullif
      9. -----------+-----------+--------
      10. abc | efg | abc
      11. (2 rows)
      12. postgres=# DROP TABLE tpcds.null_if_t1;

      如果value1等于value2则返回NULL,否则返回value1。

      1. postgres=# SELECT NULLIF('Hello','Hello World');
      2. nullif
      3. --------
      4. Hello
      5. (1 row)
    • GREATEST(最大值),LEAST(最小值)

      图 5 greatest::=

      从一个任意数字表达式的列表里选取最大的数值。

      LEAST的语法图请参见。

      图 6 least::=
      条件表达式 - 图6

      从一个任意数字表达式的列表里选取最小的数值。

      以上的数字表达式必须都可以转换成一个普通的数据类型,该数据类型将是结果类型。

      列表中的NULL值将被忽略。只有所有表达式的结果都是NULL的时候,结果才是NULL。

      1. postgres=# SELECT least(9000,2);
      2. least
      3. -------
      4. 2
      5. (1 row)

      示例请参见条件表达式函数

    • NVL

      NVL的语法图请参见。

      图 7 nvl::=

      如果value1为NULL则返回value2,如果value1非NULL,则返回value1。

      1. postgres=# SELECT nvl(null,1);
      2. nvl
      3. -----
      4. (1 row)