本節介紹 PostgreSQL 中提供的符合 SQL 標準的條件表示式。SQL-compliant conditional expressions available in PostgreSQL.
如果您的需求超出了這些條件表示式的能力範圍,您可以考慮用更具表達力的程式語言編寫伺服器端函式。
雖然 COALESCE
、GREATEST
和 LEAST
在語法上類似於函式,但它們不是普通函式,因此不能與顯式的 VARIADIC
陣列引數一起使用。
CASE
#該SQL CASE
表示式是一個通用的條件表示式,類似於其他程式語言中的 if/else 語句。
CASE WHENcondition
THENresult
[WHEN ...] [ELSEresult
] 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
表示式,它是上述通用形式的變體。
CASEexpression
WHENvalue
THENresult
[WHEN ...] [ELSEresult
] 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
分支內。
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 標準函式提供了與 NVL
和 IFNULL
類似的功能,後者在其他一些資料庫系統中也有使用。
NULLIF
#NULLIF
(value1
,value2
)
函式 NULLIF
當 value1
等於 value2
時返回 null 值;否則返回 value1
。這可以用來執行上面 COALESCE
示例的逆操作:
SELECT NULLIF(value, '(none)') ...
在此示例中,如果 value
為 (none)
,則返回 null,否則返回 value
的值。
這兩個引數必須是可比較的型別。具體來說,它們的比較方式與您寫
完全相同,因此必須有一個合適的 value1
= value2
=
運算子可用。
結果的型別與第一個引數的型別相同——但有一個微妙之處。實際返回的是隱含的 =
運算子的第一個引數,在某些情況下,該引數可能會被提升以匹配第二個引數的型別。例如,NULLIF(1, 2.2)
產生 numeric
型別,因為沒有 integer
=
numeric
運算子,只有 numeric
=
numeric
。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。