條件表達(dá)式
本節(jié)描述在本數(shù)據(jù)庫(kù)中可用的SQL兼容的條件表達(dá)式。
如果你的需求超過(guò)這些條件表達(dá)式的能力,你可能會(huì)希望用一種更富表現(xiàn)力的編程語(yǔ)言寫一個(gè)服務(wù)器端函數(shù)。
盡管
COALESCE
、GREATEST
和LEAST
在語(yǔ)法上類似于函數(shù),但它們不是普通的函數(shù),因此不能使用顯式VARIADIC
數(shù)組參數(shù)。
CASE
CASE
表達(dá)式是一種通用的條件表達(dá)式,類似于其它編程語(yǔ)言中的if/else語(yǔ)句:
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
CASE
子句可以用于任何表達(dá)式可以出現(xiàn)的地方。每一個(gè)condition
是一個(gè)返回boolean
結(jié)果的表達(dá)式。如果結(jié)果為真,那么CASE
表達(dá)式的結(jié)果就是符合條件的result
,并且剩下的CASE
表達(dá)式不會(huì)被處理。如果條件的結(jié)果不為真,那么以相同方式搜尋任何隨后的WHEN
子句。如果沒(méi)有WHEN
condition
為真,那么CASE
表達(dá)式的值就是在ELSE
子句里的result
。如果省略了ELSE
子句而且沒(méi)有條件為真,結(jié)果為空。
示例
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
表達(dá)式的數(shù)據(jù)類型都必須可以轉(zhuǎn)換成單一的輸出類型。
下面這個(gè)“簡(jiǎn)單”形式的CASE
表達(dá)式是上述通用形式的一個(gè)變種:
CASE expression
WHEN value THEN result
[WHEN ...]
[ELSE result]
END
第一個(gè)expression
會(huì)被計(jì)算,然后與所有在WHEN
子句中的每一個(gè)value
對(duì)比,直到找到一個(gè)相等的。如果沒(méi)有找到匹配的,則返回在ELSE
子句中的result
(或者控制)。 這類似于C里的switch
語(yǔ)句。
上面的例子可以用簡(jiǎn)單CASE
語(yǔ)法來(lái)寫:
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
表達(dá)式并不計(jì)算任何無(wú)助于判斷結(jié)果的子表達(dá)式。例如,下面是一個(gè)可以避免被零除錯(cuò)誤的方法:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
?
在有幾種情況中一個(gè)表達(dá)式的子表達(dá)式會(huì)被計(jì)算多次,因此“CASE
只計(jì)算必要的表達(dá)式”這一原則并非不可打破。例如一個(gè)常量子表達(dá)式1/0
通常將會(huì)在規(guī)劃時(shí)導(dǎo)致一次除零錯(cuò)誤,即便它位于一個(gè)執(zhí)行時(shí)永遠(yuǎn)也不會(huì)進(jìn)入的CASE
分支時(shí)也是如此。
COALESCE
COALESCE(value [, ...])
COALESCE
函數(shù)返回它的第一個(gè)非空參數(shù)的值。當(dāng)且僅當(dāng)所有參數(shù)都為空時(shí)才會(huì)返回空。它常用于在為顯示目的檢索數(shù)據(jù)時(shí)用缺省值替換空值。例如:
SELECT COALESCE(description, short_description, '(none)') ...
如果description
不為空,這將會(huì)返回它的值,否則如果short_description
非空則返回short_description
的值,如果前兩個(gè)都為空則返回(none)
。
所有參數(shù)都必須轉(zhuǎn)換為一個(gè)公共數(shù)據(jù)類型,它將是結(jié)果的類型。
和CASE
表達(dá)式一樣,COALESCE
將不會(huì)計(jì)算無(wú)助于判斷結(jié)果的參數(shù);也就是說(shuō),在第一個(gè)非空參數(shù)右邊的參數(shù)不會(huì)被計(jì)算。這個(gè)SQL標(biāo)準(zhǔn)函數(shù)提供了類似于NVL
和IFNULL
的能力,它們被用在某些其他數(shù)據(jù)庫(kù)系統(tǒng)中。
NULLIF
NULLIF(value1, value2)
當(dāng)value1
和value2
相等時(shí),NULLIF
返回一個(gè)空值。 否則它返回value1
。 這些可以用于執(zhí)行前文給出的COALESCE
例子的逆操作:
SELECT NULLIF(value, '(none)') ...
在這個(gè)例子中,如果value
是(none)
,將返回空值,否則返回value
的值。
這兩個(gè)參數(shù)必須具有可比較的類型。具體來(lái)說(shuō),它們的比較與你寫的 value1`` = ``value2
完全一樣,因此必須有一個(gè)合適的=
操作符可用。
結(jié)果的類型與第一個(gè)參數(shù)相同,但有一點(diǎn)細(xì)微的區(qū)別。實(shí)際上返回的是隱含 =
操作符的第一個(gè)參數(shù),在某些情況下,它將被提升以匹配第二個(gè)參數(shù)的類型。 例如,NULLIF(1, 2.2)
生成 numeric
,因?yàn)闆](méi)有integer
=
numeric
操作符,只有numeric
=
numeric
。
GREATEST和LEAST
GREATEST(value [, ...])
LEAST(value [, ...])
GREATEST
和LEAST
函數(shù)從一個(gè)任意的數(shù)字表達(dá)式列表里選取最大或者最小的數(shù)值。 這些表達(dá)式必須都可以轉(zhuǎn)換成一個(gè)普通的數(shù)據(jù)類型,它將會(huì)是結(jié)果類型 。列表中的NULL數(shù)值將被忽略。只有所有表達(dá)式的結(jié)果都是NULL的時(shí)候,結(jié)果才會(huì)是NULL。
請(qǐng)注意GREATEST
和LEAST
都不是SQL標(biāo)準(zhǔn),但卻是很常見(jiàn)的擴(kuò)展。某些其他數(shù)據(jù)庫(kù)讓它們?cè)谌魏螀?shù)為NULL時(shí)返回NULL,而不是在所有參數(shù)都為NULL時(shí)才返回NULL。