下面介绍了在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标准中体现,而是一个当前普遍的扩展函数。