條件式表示式

CASE

標準 SQL CASE 表示式有兩種形式。「簡單」形式會從左到右搜尋每個 value 表示式,直到找到與 expression 相等的表示式為止

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

傳回相符 valueresult。如果找不到相符項目,則傳回 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

具有 TRYNULL

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

具有 TRYCOALESCE 的預設值

SELECT COALESCE(TRY(total_cost / packages), 0) AS per_package FROM shipping;
 per_package
-------------
          4
         14
          0
         19
(4 rows)