條件式表示式¶
CASE¶
標準 SQL CASE
表示式有兩種形式。「簡單」形式會從左到右搜尋每個 value
表示式,直到找到與 expression
相等的表示式為止
CASE expression
WHEN value THEN result
[ WHEN ... ]
[ ELSE result ]
END
傳回相符 value
的 result
。如果找不到相符項目,則傳回 ELSE
子句的 result
(如果有的話),否則傳回 null。範例
SELECT a,
CASE a
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'many'
END
「搜尋」形式會從左到右評估每個布林值 condition
,直到有一個為 true 為止,並傳回相符的 result
CASE
WHEN condition THEN result
[ WHEN ... ]
[ ELSE result ]
END
如果沒有任何條件為 true,則傳回 ELSE
子句的 result
(如果有的話),否則傳回 null。範例
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)¶
如果
condition
為 true,則評估並傳回true_value
,否則傳回 null,且不評估true_value
。
- if(condition, true_value, false_value)¶
如果
condition
為 true,則評估並傳回true_value
,否則評估並傳回false_value
。
COALESCE¶
- coalesce(value1, value2[, ...])¶
傳回引數清單中第一個非 null 的
value
。就像CASE
表示式一樣,只有在必要時才會評估引數。
NULLIF¶
- nullif(value1, value2)¶
如果
value1
等於value2
,則傳回 null,否則傳回value1
。
TRY¶
- try(expression)¶
評估表示式並處理特定類型的錯誤,方法是傳回
NULL
。
在遇到損壞或無效的資料時,如果查詢最好產生 NULL
或預設值,而不是失敗,則 TRY
函式可能會很有用。若要指定預設值,TRY
函式可以與 COALESCE
函式搭配使用。
下列錯誤會由 TRY
處理
除以零
無效的轉換引數或無效的函式引數
數值超出範圍
範例¶
具有一些無效資料的來源資料表
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
具有 TRY
和 COALESCE
的預設值
SELECT COALESCE(TRY(total_cost / packages), 0) AS per_package FROM shipping;
per_package
-------------
4
14
0
19
(4 rows)