PostgreSQL 行和數(shù)組比較

2021-08-27 10:39 更新
9.24.1. IN
9.24.2. NOT IN
9.24.3. ANY/SOME (array)
9.24.4. ALL (array)
9.24.5. 行構(gòu)造器比較
9.24.6. 組合類(lèi)型比較

本節(jié)描述幾個(gè)特殊的結(jié)構(gòu),用于在值的組之間進(jìn)行多重比較。這些形式語(yǔ)法上和前面一節(jié)的子查詢(xún)形式相關(guān),但是不涉及子查詢(xún)。 這種形式涉及的數(shù)組子表達(dá)式是PostgreSQL的擴(kuò)展; 其它的是SQL兼容的。所有本節(jié)記錄的表達(dá)式形式都返回布爾(Boolean)結(jié)果(真/假)。

9.24.1. IN

expression IN (value [, ...])

右手邊是一個(gè)圓括弧包圍的標(biāo)量列表。如果左手邊表達(dá)式的結(jié)果等于任何右手邊表達(dá)式中的一個(gè),結(jié)果為。它是下面形式的縮寫(xiě)

expression = value1
OR
expression = value2
OR
...

請(qǐng)注意如果左手邊表達(dá)式得到空值,或者沒(méi)有相等的右手邊值并且至少有一個(gè)右手邊的表達(dá)式得到空值,那么IN結(jié)構(gòu)的結(jié)果將為空值,而不是假。這符合 SQL 處理空值的布爾組合的一般規(guī)則。

9.24.2. NOT IN

expression NOT IN (value [, ...])

右手邊是一個(gè)圓括弧包圍的標(biāo)量列表。如果左手邊表達(dá)式的結(jié)果不等于所有右手邊表達(dá)式,結(jié)果為。它是下面形式的縮寫(xiě)

expression <> value1
AND
expression <> value2
AND
...

請(qǐng)注意如果左手邊表達(dá)式得到空值,或者沒(méi)有相等的右手邊值并且至少有一個(gè)右手邊的表達(dá)式得到空值,那么NOT IN結(jié)構(gòu)的結(jié)果將為空值, 而不是我們可能天真地認(rèn)為的真值。這符合 SQL 處理空值的布爾組合的一般規(guī)則。

提示

x NOT IN y在所有情況下都等效于NOT (x IN y)。但是,在處理空值的時(shí)候,用NOT IN比用IN更可能迷惑新手。最好盡可能用正邏輯來(lái)表達(dá)你的條件。

9.24.3. ANY/SOME (array)

expression operator ANY (array expression)
expression operator SOME (array expression)

右手邊是一個(gè)圓括弧包圍的表達(dá)式,它必須得到一個(gè)數(shù)組值。左手邊表達(dá)式被計(jì)算并且使用給出的操作符對(duì)數(shù)組的每個(gè)元素進(jìn)行比較,這個(gè)操作符必須得到布爾結(jié)果。如果得到了任何真值結(jié)果,那么ANY的結(jié)果是。 如果沒(méi)有找到真值結(jié)果(包括數(shù)組只有零個(gè)元素的情況),那么結(jié)果是 。

如果數(shù)組表達(dá)式得到一個(gè)空數(shù)組,ANY的結(jié)果將為空值。如果左手邊的表達(dá)式得到空值,ANY通常是空值(盡管一個(gè)非嚴(yán)格比較操作符可能得到一個(gè)不同的結(jié)果)。另外,如果右手邊的數(shù)組包含任何空值元素或者沒(méi)有得到真值比較結(jié)果,ANY的結(jié)果將是空值而不是假(再次,假設(shè)是一個(gè)嚴(yán)格的比較操作符)。這符合 SQL 對(duì)空值的布爾組合的一般規(guī)則。

SOMEANY的同義詞。

9.24.4. ALL (array)

expression operator ALL (array expression)

右手邊是一個(gè)圓括弧包圍的表達(dá)式,它必須得到一個(gè)數(shù)組值。左手邊表達(dá)式將被計(jì)算并使用給出的操作符與數(shù)組的每個(gè)元素進(jìn)行比較,這個(gè)操作符必須得到一個(gè)布爾結(jié)果。如果所有比較都得到真值結(jié)果,那么ALL的結(jié)果是 (包括數(shù)組只有零個(gè)元素的情況)。如果有任何假值結(jié)果,那么結(jié)果是

如果數(shù)組表達(dá)式得到一個(gè)空數(shù)組,ALL的結(jié)果將為空值。如果左手邊的表達(dá)式得到空值,ALL通常是空值(盡管一個(gè)非嚴(yán)格比較操作符可能得到一個(gè)不同的結(jié)果)。另外,如果右手邊的數(shù)組包含任何空值元素或者沒(méi)有得到假值比較結(jié)果,ALL的結(jié)果將是空值而不是真(再次,假設(shè)是一個(gè)嚴(yán)格的比較操作符)。這符合 SQL 對(duì)空值的布爾組合的一般規(guī)則。

9.24.5. 行構(gòu)造器比較

row_constructor operator row_constructor

每一邊都是一個(gè)行構(gòu)造器,如第 4.2.13 節(jié)所述。兩個(gè)行值必須具有相同數(shù)量的域。每一邊被計(jì)算并且被逐行比較。當(dāng)操作符=、 <>、 < <=、 >、 >=時(shí),允許進(jìn)行行構(gòu)造器比較。每一個(gè)行元素必須是具有一個(gè)默認(rèn) B 樹(shù)操作符類(lèi)的類(lèi)型,否則嘗試比較會(huì)產(chǎn)生一個(gè)錯(cuò)誤。

注意

Errors related to the number or types of elements might not occur if the comparison is resolved using earlier columns.

=<>情況略有不同。如果兩行的所有對(duì)應(yīng)成員都是非空且相等則這兩行被認(rèn)為相等;如果任何對(duì)應(yīng)成員是非空但是不相等則這兩行不相等;否則行比較的結(jié)果為未知(空值)。

對(duì)于<、<=>>=情況,行元素被從左至右比較,在找到一處不等的或?yàn)榭盏脑貙?duì)就立刻停下來(lái)。如果這一對(duì)元素都為空值,則行比較的結(jié)果為未知(空值);否則這一對(duì)元素的比較結(jié)果決定行比較的結(jié)果。例如,ROW(1,2,NULL) < ROW(1,3,0)得到真,而不是空值,因?yàn)榈谌龑?duì)元素并沒(méi)有被考慮。

注意

PostgreSQL 8.2之前,<、<=、>>=情況不是按照每個(gè) SQL 聲明來(lái)處理的。一個(gè)像ROW(a,b) < ROW(c,d)的比較會(huì)被實(shí)現(xiàn)為 a < c AND b < d,而結(jié)果行為等價(jià)于a < c OR (a = c AND b < d)。

row_constructor IS DISTINCT FROM row_constructor

這個(gè)結(jié)構(gòu)與<>行比較相似,但是它對(duì)于空值輸入不會(huì)得到空值。任何空值被認(rèn)為和任何非空值不相等(有區(qū)別),并且任意兩個(gè)空值被認(rèn)為相等(無(wú)區(qū)別)。因此結(jié)果將總是為真或?yàn)榧伲肋h(yuǎn)不會(huì)是空值。

row_constructor IS NOT DISTINCT FROM row_constructor

這個(gè)結(jié)構(gòu)與=行比較相似,但是它對(duì)于空值輸入不會(huì)得到空值。任何空值被認(rèn)為和任何非空值不相等(有區(qū)別),并且任意兩個(gè)空值被認(rèn)為相等(無(wú)區(qū)別)。因此結(jié)果將總是為真或?yàn)榧?,永遠(yuǎn)不會(huì)是空值。

9.24.6. 組合類(lèi)型比較

record operator record

SQL 規(guī)范要求在結(jié)果依賴(lài)于比較兩個(gè) NULL 值或者一個(gè) NULL 與一個(gè)非 NULL 時(shí)逐行比較返回 NULL。PostgreSQL只有在比較兩個(gè)行構(gòu)造器(如第 9.24.5 節(jié))的結(jié)果或者比較一個(gè)行構(gòu)造器與一個(gè)子查詢(xún)的輸出時(shí)才這樣做(如 第 9.23 節(jié)中所述)。在其他比較兩個(gè)組合類(lèi)型值的環(huán)境中,兩個(gè) NULL 域值被認(rèn)為相等,并且一個(gè) NULL 被認(rèn)為大于一個(gè)非 NULL。為了得到組合類(lèi)型的一致的排序和索引行為,這樣做是必要的。

每一邊都會(huì)被計(jì)算并且它們會(huì)被逐行比較。當(dāng)操作符=、 <><、 <=>或者 >=時(shí)或者具有與這些類(lèi)似的語(yǔ)義時(shí),允許組合類(lèi)型的比較(更準(zhǔn)確地說(shuō),如果一個(gè)操作符是一個(gè) B 樹(shù)操作符類(lèi)的成員,或者是一個(gè) B 樹(shù)操作符類(lèi)的=成員的否定詞,它就可以是一個(gè)行比較操作符)。 上述操作符的行為與用于行構(gòu)造器(見(jiàn)第 9.24.5 節(jié))的IS [ NOT ] DISTINCT FROM相同。

為了支持包含無(wú)默認(rèn) B 樹(shù)操作符類(lèi)的元素的行匹配,為組合類(lèi)型比較定義了下列操作符: *=、 *<>、 *<、 *<=、 *>以及 *>=。 這些操作符比較兩行的內(nèi)部二進(jìn)制表達(dá)。即使兩行用相等操作符的比較為真,兩行也可能具有不同的二進(jìn)制表達(dá)。 行在這些比較操作符之下的排序是決定性的,其他倒沒(méi)什么意義。 這些操作符在內(nèi)部被用于物化視圖并且可能對(duì)其他如復(fù)制和B-樹(shù)復(fù)制(參見(jiàn) 第 63.4.2 節(jié))之類(lèi)的特殊功能有用,但是它們并不打算用在書(shū)寫(xiě)查詢(xún)這類(lèi)普通用途中。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)