W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
IN
NOT IN
ANY
/SOME
(array)ALL
(array)本節(jié)描述幾個(gè)特殊的結(jié)構(gòu),用于在值的組之間進(jìn)行多重比較。這些形式語(yǔ)法上和前面一節(jié)的子查詢(xún)形式相關(guān),但是不涉及子查詢(xún)。 這種形式涉及的數(shù)組子表達(dá)式是PostgreSQL的擴(kuò)展; 其它的是SQL兼容的。所有本節(jié)記錄的表達(dá)式形式都返回布爾(Boolean)結(jié)果(真/假)。
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ī)則。
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á)你的條件。
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ī)則。
SOME
是ANY
的同義詞。
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ī)則。
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ì)是空值。
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)普通用途中。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: