?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
本節(jié)描述在PostgreSQL里可用的SQL兼容的條件表達(dá)式。
Tip: 如果你的需求超過(guò)這些條件表達(dá)式的能力,你可能會(huì)希望用一種更富表現(xiàn)力的編程語(yǔ)言寫(xiě)一個(gè)存儲(chǔ)過(guò)程。
SQLCASE表達(dá)式是一種通用的條件表達(dá)式,類似于其它語(yǔ)言中的 if/else 語(yǔ)句
CASE WHENconditionTHENresult [WHEN ...] [ELSEresult] END
CASE CASE子句可以用于任何表達(dá)式可以存在的地方。condition是一個(gè) 返回boolean的表達(dá)式。如果條件真,那么CASE表達(dá)式的結(jié)果就是符合 條件的result。如果結(jié)果為假,那么以相同方式搜尋任何隨后的 WHEN 子句。 如果沒(méi)有WHENcondition為真, 那么表達(dá)式的結(jié)果就是在ELSE子句里的result。 如果省略了ELSE子句且沒(méi)有匹配的條件,結(jié)果為 NULL 。
一個(gè)示例:
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)換成單一的輸出類型。參閱Section 10.5獲取細(xì)節(jié)
下面這個(gè)"簡(jiǎn)單的"simple""CASE表達(dá)式,上面一般形式的一個(gè)變種:
CASEexpression WHENvalueTHENresult [WHEN ...] [ELSEresult] END
先計(jì)算expression的值,然后與所有WHEN
子句里聲明的value對(duì)比,
直到找到一個(gè)相等的。如果沒(méi)有找到匹配的,
則返回在ELSE子句里的result(或者 NULL)。
這個(gè)類似于 C 里的switch
語(yǔ)句
上面的例子可以用簡(jiǎn)單CASE語(yǔ)法來(lái)寫(xiě):
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ì)算任何對(duì)于判斷結(jié)果并不需要的子表達(dá)式。 比如,下面是一個(gè)可以避免被零除的方法:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
COALESCE
(value[, ...])
COALESCE
返回它的第一個(gè)非 NULL 的參數(shù)值。
僅當(dāng)所有參數(shù)為NULL時(shí)返回NULL。常用于在檢索,顯示數(shù)據(jù)時(shí)用缺省值替換 NULL。例如:
SELECT COALESCE(description, short_description, '(none)') ...
和CASE表達(dá)式一樣,COALESCE
不會(huì)計(jì)算不需要用來(lái)判斷結(jié)果的參數(shù);也就是說(shuō),
在第一個(gè)非空參數(shù)右邊的參數(shù)不會(huì)被計(jì)算。這個(gè)符合 SQL標(biāo)準(zhǔn)的函數(shù)提供了與某些其它數(shù)據(jù)庫(kù)系統(tǒng)中的NVL
和IFNULL
類似的功能。
NULLIF
(value1,value2)
當(dāng)且僅當(dāng)value1和value2相等時(shí),NULLIF
才返回 NULL 。
否則它返回value1。
這些可以用于執(zhí)行上面給出的COALESCE
例子的反例:
SELECT NULLIF(value, '(none)') ...
如果value是(none)那么返回 NULL ,否則返回value
GREATEST
(value[, ...])
LEAST
(value[, ...])
GREATEST
和LEAST
函數(shù)從一個(gè)任意數(shù)字表達(dá)式的列表里選取最大或最小的數(shù)值。
這些表達(dá)式必須都可以轉(zhuǎn)換成一個(gè)普通的數(shù)據(jù)類型,它將會(huì)是結(jié)果
類型(見(jiàn)Section 10.5獲取細(xì)節(jié))。列表中的 NULL 值將被忽略。
只有所有表達(dá)式的結(jié)果都是 NULL 的時(shí)候,結(jié)果才會(huì)是 NULL 。
請(qǐng)注意GREATEST
和LEAST
都不是SQL標(biāo)準(zhǔn),但卻是很常見(jiàn)的擴(kuò)展。
在一些其它數(shù)據(jù)庫(kù)中,只要任何參數(shù)為NULL,它們結(jié)果返回NULL,而不是僅當(dāng)所有結(jié)果為NULL。