CASE
标准SQL中 CASE 表达式有两种结构。 简单的 CASE 表达式会从左到右依次查找 value直到找到和 expression 相等的:
- CASE expression
- WHEN value THEN result
- [ WHEN ... ]
- [ ELSE result ]
- END
找到相等的 value 后会返回对应的 result 结果。 如果没有找到相等的value,则会返回 ELSE 语句的 result 结果。 例如:
- SELECT a,
- CASE a
- WHEN 1 THEN 'one'
- WHEN 2 THEN 'two'
- ELSE 'many'
- END
高级的 CASE 表达式会从左到右依次计算 condition 直到第一个为TRUE 的 condition,并返回对应的 result 结果。
- CASE
- WHEN condition THEN result
- [ WHEN ... ]
- [ ELSE result ]
- END
如果没有为 True 的 condition,则 ELSE 子句的result 会返回。 例如:
- SELECT a, b,
- CASE
- WHEN a = 1 THEN 'aaa'
- WHEN b = 2 THEN 'bbb'
- ELSE 'ccc'
- END
IF
IF 函数是和以下 CASE 表达式效果相同的语言结构:
- CASE
- WHEN condition THEN true_value
- [ ELSE false_value ]
- END
if(condition, true_value)
计算返回 true_value 如果 condition 为 TRUE,否则返回 NULL。
if(condition, true_value, false_value)计算返回true_value 如果 condition 为 TRUE, 否则计算返回false_value。
COALESCE
coalesce(value[, …])
返回第一个非 NULL 的 value。 和 CASE 表达式类似, 参数仅在需要的时候计算。
IFNULL
If expr1 is not NULL, IFNULL() returns expr1; otherwise it returns expr2.
支持的语法:
IFNULL(expr1,expr2)
例子:
- SELECT IFNULL(1,0);
- SELECT IFNULL(NULL,10);
NULLIF
nullif(value1, value2)返回 NULL 如果value1 等于 value2, 否则返回 value1。
支持的语法:
NULLIF(expr1,expr2)
例子:
- SELECT NULLIF(1,1);
- SELECT NULLIF(1,2);
TRY
try(expression)
计算返回表达式 expression 如果表达式计算遇到错误则返回 NULL。
当你不希望查询抛出异常的时候,可以使用 TRY 函数屏蔽异常。TRY 函数在遇到异常的时候会返回NULL, 如果希望在查询出错的时候返回默认值,可以 使用 COALESCE 函数指定默认值。
TRY 函数可以处理以下错误:
- 除0
- Invalid cast or function argument
- 数值大小超出范围
例子
源数据表包含非法数据:
- SELECT * FROM shipping;
- origin_state | origin_zip | packages | total_cost
- --------------+------------+----------+------------
- California | 94131 | 25 | 100
- California | P332a | 5 | 72
- California | 94025 | 0 | 155
- New Jersey | 08544 | 225 | 490
- (4 rows)
不用 TRY 函数导致查询失败:
- SELECT CAST(origin_zip AS BIGINT) FROM shipping;
- Query failed: Can not cast 'P332a' to BIGINT
TRY 函数返回 NULL:
- SELECT TRY(CAST(origin_zip AS BIGINT)) FROM shipping;
- origin_zip
- ------------
- 94131
- NULL
- 94025
- 08544
- (4 rows)
不用 TRY 函数导致查询失败:
- SELECT total_cost / packages AS per_package FROM shipping;
- Query failed: / by zero
COALESCE 嵌套 TRY 函数返回默认值:
- SELECT COALESCE(TRY(total_cost / packages), 0) AS per_package FROM shipping;
- per_package
- -------------
- 4
- 14
- 0
- 19
- (4 rows)
Control Flow 函数MySQL兼容性(ADS已经支持的MySQL函数)
COALESCE
Returns the first non-NULL value in the list, or NULL if there are nonon-NULL values.
支持的语法:
COALESCE(value,...)
例子:
- SELECT COALESCE(NULL,1);
- SELECT COALESCE(NULL,NULL,NULL);
GREATEST
With two or more arguments, returns the largest (maximum-valued)argument.
支持的语法:
GREATEST(value1,value2,...)
例子:
- SELECT GREATEST(2,0);
- SELECT GREATEST(34.0,3.0,5.0,767.0);
- SELECT GREATEST('B','A','C');
LEAST
With two or more arguments, returns the smallest (minimum-valued)argument.
支持的语法:
LEAST(value1,value2,...)
例子:
- SELECT LEAST(2,0);
- SELECT LEAST(34.0,3.0,5.0,767.0);
- SELECT LEAST('B','A','C');
Control Flow 函数Oracle兼容性(ADS已经支持的Oracle函数)
NVL2
NVL2 lets you determine the value returned by a query based on whether aspecified expression is null or not null. If expr1 is not null, then NVL2returns expr2. If expr1 is null, then NVL2 returns expr3.
支持的语法:
NVL2(expr1, expr2, expr3)
例子:
- SELECT NVL2(1, 2, 3);
- SELECT NVL2(NULL, 2, 3);
DECODE
DECODE compares expr to each search value one by one. If expr is equal to asearch, then AnalyticDB returns the corresponding result.
支持的语法:
DECODE(expr, search, result, default)
例子:
- SELECT DECODE(1, 1, '1A', 2, '2A', '3A');
- SELECT DECODE(2, 1, '1A', 2, '2A', '3A');