2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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. 條件表示式 #

本節介紹 PostgreSQL 中提供的符合 SQL 標準的條件表示式。SQL-compliant conditional expressions available in 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)

函式 NULLIFvalue1 等於 value2 時返回 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。其他一些資料庫也遵循這種行為。)

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。