支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

9.18. 條件式表示式 #

本節描述了SQL中可用的符合PostgreSQL的條件式表示式。

提示

如果您的需求超出這些條件式表示式的能力範圍,您可能需要考慮使用更具表達力的程式語言編寫伺服器端函式。

注意

雖然 COALESCEGREATESTLEAST 在語法上與函式相似,但它們不是普通的函式,因此不能與明確的 VARIADIC 陣列引數一起使用。

9.18.1. CASE #

這個SQL CASE 表示式是一種通用的條件式表示式,類似於其他程式語言中的 if/else 陳述式。

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

CASE 子句可以在任何表示式有效的地方使用。每個 condition 都是一個返回 boolean 結果的表示式。如果條件的結果為 true,則 CASE 表示式的值是條件後面的 result,並且不處理 CASE 表示式的其餘部分。如果條件的結果不為 true,則以相同的方式檢查任何後續的 WHEN 子句。如果沒有 WHEN condition 產生 true,則 CASE 表示式的值是 ELSE 子句的 result。如果省略 ELSE 子句且沒有條件為 true,則結果為 null。

一個範例

SELECT * FROM test;

 a
---
 1
 2
 3


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

所有 result 表示式的資料類型必須可轉換為單一輸出類型。有關更多詳細資訊,請參閱第 10.5 節

有一種 簡單 形式的 CASE 表示式,它是上述一般形式的變體

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

首先計算 expression,然後將其與 WHEN 子句中的每個 value 表示式進行比較,直到找到一個與之相等的表示式。如果找不到匹配項,則返回 ELSE 子句的 result(或 null 值)。這類似於 C 中的 switch 陳述式。

可以使用簡單的 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

CASE 表示式不會評估確定結果不需要的任何子表示式。例如,這是一種避免除以零錯誤的可能方法

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

注意

第 4.2.14 節所述,在某些情況下,表示式的子表示式會在不同的時間進行評估,因此 CASE 僅評估必要的子表示式 的原則並非絕對。例如,即使常數 1/0 子表示式位於永遠不會在執行時輸入的 CASE 分支中,通常也會在規劃時導致除以零錯誤。

9.18.2. COALESCE #

COALESCE(value [, ...])

COALESCE 函式會傳回其引數中第一個非 null 的引數。只有當所有引數都為 null 時,才會傳回 Null。它通常用於在擷取資料以進行顯示時,將預設值取代為 null 值,例如

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

如果 description 不是 null,則此傳回 description,否則如果 short_description 不是 null,則傳回 short_description,否則傳回 (none)

引數必須都可以轉換為通用資料類型,這將是結果的類型(請參閱第 10.5 節以取得詳細資訊)。

CASE 表示式一樣,COALESCE 只會評估確定結果所需的引數;也就是說,不會評估第一個非 null 引數右側的引數。這個 SQL 標準函式提供的功能類似於某些其他資料庫系統中使用的 NVLIFNULL

9.18.3. NULLIF #

NULLIF(value1, value2)

如果 value1 等於 value2,則 NULLIF 函數會傳回空值 (null);否則,它會傳回 value1。這可用於執行上述 COALESCE 範例的反向操作。

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

在這個範例中,如果 value(none),則會傳回空值 (null),否則會傳回 value 的值。

這兩個引數必須是可比較的類型。更具體地說,它們的比較方式就像您寫了 value1 = value2 一樣,因此必須有一個可用的 = 運算子。

結果與第一個引數的類型相同 — 但有一個微妙之處。實際上傳回的是隱含 = 運算子的第一個引數,在某些情況下,它會被提升以匹配第二個引數的類型。例如,NULLIF(1, 2.2) 產生 numeric,因為沒有 integer = numeric 運算子,只有 numeric = numeric

9.18.4. GREATESTLEAST #

GREATEST(value [, ...])
LEAST(value [, ...])

GREATESTLEAST 函數從任何數量的表達式列表中選擇最大或最小值。這些表達式必須都可以轉換為一個通用資料類型,這將是結果的類型(有關詳細資訊,請參閱 第 10.5 節)。

引數列表中的 NULL 值會被忽略。只有當所有表達式都評估為 NULL 時,結果才會是 NULL。(這與 SQL 標準有所偏差。根據該標準,如果任何引數為 NULL,則傳回值為 NULL。某些其他資料庫以這種方式運作。)

提交更正

如果您發現文件中任何不正確、與您使用特定功能時的經驗不符或需要進一步澄清的地方,請使用此表單回報文件問題。