本節描述了SQL中可用的符合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
)
如果 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
。
如果您發現文件中任何不正確、與您使用特定功能時的經驗不符或需要進一步澄清的地方,請使用此表單回報文件問題。