下面介绍了在PolarDB PostgreSQL版(兼容Oracle)中可使用的与SQL语言兼容的条件表达式。

CASE

SQL语言的CASE表达式为一般条件表达式,类似于其它语言中的if/else语句:

CASE WHEN condition THEN result
   [ WHEN ... ]
   [ ELSE result ]
END

CASE子句可使用于任何有效的表达式中。condition是一个返回BOOLEAN结果的表达式。如果结果为TRUE,那么CASE表达式的值就是条件后面的result。如果结果为FALSE,那么任何随后的WHEN子句都会以相同的行为进行搜索。如果没有WHEN condition为TRUE, 那么CASE表达式的值就是ELSE子句中的result。如果省略ELSE子句,且没有任何匹配的条件,结果就为NULL空值。

SELECT * FROM test;

 a
---
 1
 2
 3
(3 rows)

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
(3 rows)

所有result表达式的数据类型必须可转换为单一的输出类型。

下列“简单” CASE表达式是上述一般形式的一个指定变量:

CASE expression
    WHEN value THEN result
  [ WHEN ... ]
  [ ELSE result ]
END

Expression将被计算并且和WHEN子句中所有指定的value进行比较,直到发现一个与之相等的结果。 如果没有发现匹配的信息,那么将返回ELSE子句中的result(或一个空值)。

上述示例可以用简单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
(3 rows)

CASE表达式不评估任何不用于决定结果的子表达式。例如,下面的方法是一种可能会避免除以零的无效结果:

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

COALESCE

函数COALESCE返回的是它第一个不是空值的参数。只有在所有参数都为空值的情况下,才会返回空值。

COALESCE(value [, value2 ] ... )

当为了显示或更进一步的计算而取回数据时,通常都会用缺省值代替空值。例如:

SELECT COALESCE(description, short_description, '(none)') ...

像CASE表达式一样,COALESCE不会评估任何不用于决定结果的参数。也就是说,第一个非空参数右侧的参数将不被评估。SQL标准的函数提供类似于NVL和IFNULL的功能,这些功能可用于一些其它的数据库系统中。

NULLIF

如果value1和value2相等,函数NULLIF返回空值,否则它返回value1。

NULLIF(valuel, value2)

这个函数做出运算操作用和上面给出的关于函数COALESCE的示例正好相反:

SELECT NULLIF(value1, '(none)') ...

如果value1是(none),返回空值,否则返回参数value1的值。

NVL

函数NVL返回的是它第一个非空值的参数。函数NVL评估的是第一个表达式。如果这个表达式被评估为NULL,那么函数NVL返回的则是第二个表达式。

NVL(exprl, expr2)

返回的类型和参数类型是一样的。所有参数必须是相同的数据类型(或可以变为常用数据类型)。如果所有参数都为NULL,那么函数NVL返回的则是NULL空值。

下列示例为那些没有佣金的员工计算了佣金。如果员工有佣金,那么这个表达式返回的就是员工的佣金; 如果员工没有佣金,(也就是说,员工的佣金为NULL),那么这个表达式返回的就是佣金,金额为该员工薪水的10%。

bonus = NVL(emp.commission, emp.salary * .10)

NVL2

NVL2用于评估表达式,并返回第二个或第三个表达式,主要取决于第一个表达式的值。如果第一个表达式不是NULL,那么NVL2返回的就是expr2的值;如果第一个表达式为NULL,那么NVL2返回的则是expr3的值。

NVL2(expr1, expr2, expr3)

返回的类型和参数类型是一致的。所有参数必须是相同的数据类型(或可以变为常用数据类型)。

下列示例计算了有佣金员工的佣金。如果指定的员工有佣金,那么这个表达式所返回的佣金数额相当于员工佣金的110%。 如果这个员工没有佣金(也就是说该员工的佣金为NULL),那么这个表达式返回的则是0。

bonus = NVL2(emp.commission, emp.commission * 1-1, 0)

GREATEST和LEAST

GREATEST和LEAST函数用于从任意数量的表达式中查询出最大或最小的数值。

GREATEST(value [, value2 ] ... )

LEAST(value [, value2 ] ... )

表达式必须都可以转换成一个通用的数据类型,这个通用数据类型是结果的类型。而在列表中的空值是忽略的。只有所有的表达式计算值为空的时候,最后结果才为空值。

需要注意的函数GREATEST 和LEAST不在SQL标准中体现,而是一个当前普遍的扩展函数。