?
This document uses PHP Chinese website manual Release
本節(jié)描述幾個(gè)特殊的構(gòu)造,用于在多組值之間進(jìn)行多重比較。 這些形式語(yǔ)法上和上一節(jié)的子查詢(xún)形式相關(guān),但是不涉及子查詢(xún)。 這種形式涉及的數(shù)組子表達(dá)式是PostgreSQL的擴(kuò)展; 其它的是SQL兼容的。所有本節(jié)記錄的表達(dá)式形式都返回布爾值(真/假)。
expressionIN (value[, ...])
右邊是一個(gè)圓括號(hào)括起來(lái)的標(biāo)量列表。如果左邊的表達(dá)式結(jié)果等于任何右邊表達(dá)式中的一個(gè), 結(jié)果為"真"true""。它是下面這種方式的縮寫(xiě)
expression=value1 OR expression=value2 OR ...
請(qǐng)注意,如果左邊表達(dá)式的值為 NULL ,或者沒(méi)有相等的右邊值并且至少有一 個(gè)右邊表達(dá)式的值為 NULL ,那么IN的結(jié)果將是 NULL , 而不是假。這個(gè)行為遵照 SQL 處理布爾值和 NULL 組合時(shí)的規(guī)則
expressionNOT IN (value[, ...])
右邊是一個(gè)圓括號(hào)括起來(lái)的標(biāo)量列表。如果左邊的表達(dá)式結(jié)果不等于任何右邊表達(dá)式, 結(jié)果為"真"true""。它是下面這種方式的縮寫(xiě)
expression<>value1 AND expression<>value2 AND ...
請(qǐng)注意,如果左邊表達(dá)式的值為 NULL ,或者沒(méi)有相等的右邊值并且至少 有一個(gè)右邊表達(dá)式的值為 NULL ,那么NOT IN的結(jié)果將是 NULL , 而不是真。這個(gè)行為遵照 SQL 處理布爾值和 NULL 組合時(shí)的規(guī)則。
Tip: x NOT IN y在所有場(chǎng)合都等價(jià)于NOT (x IN y)。但是,在處理 NULL 的時(shí)候, 用NOT IN比用IN更容易迷惑新手。最好用正邏輯來(lái)表達(dá)你的條件。
expressionoperatorANY (array expression) expressionoperatorSOME (array expression)
右邊是一個(gè)圓括號(hào)括起來(lái)的表達(dá)式,它必須生成一個(gè)數(shù)組值。 左邊表達(dá)式使用operator對(duì)數(shù)組的每一個(gè)元素進(jìn)行一次計(jì)算和比較, 其結(jié)果必須是布爾值。如果至少獲得一個(gè)真值,則ANY結(jié)果為"真"true""。 如果全部獲得假值,則結(jié)果是"假"false""(包括數(shù)組不含任何元素的情況)。
如果數(shù)組表達(dá)式的值為 NULL ,那么ANY的結(jié)果也為 NULL 。如果左邊表達(dá)式的 值為 NULL ,那么ANY的結(jié)果通常也為 NULL(某些不嚴(yán)格的比較操作符可能得到 不同的結(jié)果)。另外,如果右邊的數(shù)組表達(dá)式中包含 NULL 元素并且沒(méi)有為真的比較結(jié)果, 那么 ANY 的結(jié)果將是 NULL(某些不嚴(yán)格的比較操作符可能得到不同的結(jié)果), 而不是假。這個(gè)行為遵照 SQL 處理布爾值和 NULL 組合時(shí)的規(guī)則
SOME是ANY的同意詞。
expressionoperatorALL (array expression)
右邊是一個(gè)圓括號(hào)括起來(lái)的表達(dá)式,它必須生成一個(gè)數(shù)組值。左邊表達(dá)式 使用operator對(duì)數(shù)組的每一個(gè)元素進(jìn)行一次計(jì)算和比較,其結(jié)果必須是布爾值。 如果全部獲得真值,ALL 結(jié)果為"真"true""(包括數(shù)組不含任何元素的情況)。如果至少獲得一個(gè)假值,則結(jié)果是"假"。
如果數(shù)組表達(dá)式產(chǎn)生一個(gè)NULL數(shù)組,結(jié)果將為 NULL。如果左邊表達(dá)式的值為 NULL ,那么ALL的結(jié)果通常也為 NULL(某些不嚴(yán)格的比較 操作符可能得到不同的結(jié)果)。另外,如果右邊的數(shù)組表達(dá)式中包含 NULL 元素并且沒(méi)有為假的比較結(jié)果,那么ALL的結(jié)果將是 NULL(某些不嚴(yán)格的比較操作符可能得到不同的結(jié)果), 而不是真。這個(gè)行為遵照 SQL 處理布爾值和 NULL 組合時(shí)的規(guī)則。
row_constructoroperatorrow_constructor
兩邊都是一個(gè)Section 4.2.12所述的行構(gòu)造器;兩個(gè)行的字段數(shù)必須相同。 兩邊都被計(jì)算并且逐行比較。目前,用于比較的operator 操作符僅允許為=, <>, <, <=, >or >=,或與其具有相似的語(yǔ)意。 特別地,如果一個(gè)操作符屬于 B-Tree 操作符類(lèi), 那么該操作符可以是一個(gè)行比較操作符或除=之外的 B-Tree 操作符類(lèi)。
=和<>與其它操作符稍有區(qū)別。如果兩行對(duì)應(yīng)的元素全都非空且相等, 那么這兩行就被認(rèn)為是相等的;如果兩行對(duì)應(yīng)的元素中有任意一對(duì)非空且不等, 那么這兩行就被認(rèn)為是不等的;否則這兩行的比較結(jié)果是未知(NULL)。
對(duì)于<,<=,>和 >=操作符,行中的元素將按照從左到右的順序依次進(jìn)行比較, 直到遇見(jiàn)一對(duì)不相等的元素或者一對(duì) NULL 值。如果這對(duì)元素中存在至少一個(gè) NULL 值, 那么比較的結(jié)果是 NULL ;否則這對(duì)元素的比較結(jié)果就是最終的比較結(jié)果。 例如,ROW(1,2,NULL) < ROW(1,3,0)的結(jié)果是真而不是 NULL , 因?yàn)楸容^到第二對(duì)元素的時(shí)候就已經(jīng)得到了最終結(jié)果,不需要對(duì)第三對(duì)元素進(jìn)行比較了。
Note: 在PostgreSQL8.2之前,<,<=,>>=并不遵守 SQL 標(biāo)準(zhǔn)。 比如,ROW(a,b) < ROW(c,d)將等價(jià)于a < c AND b < d, 而正確的做法應(yīng)當(dāng)是等價(jià)于 a< c OR (a = c AND b< d) 。
row_constructorIS DISTINCT FROMrow_constructor
這個(gè)構(gòu)造類(lèi)似于<>行比較,但是它對(duì) NULL 輸入不生成 NULL , 而是認(rèn)為任何 NULL 都不等于任何非 NULL ,并且 NULL 之間是相等的。 因此,結(jié)果要么是真要么是假,而絕不會(huì)是未知(NULL)。
row_constructorIS NOT DISTINCT FROMrow_constructor
這個(gè)構(gòu)造類(lèi)似于=行比較,但是它對(duì) NULL 輸入不生成 NULL , 而是認(rèn)為任何 NULL 都不等于任何非 NULL ,并且 NULL 之間是相等的。 因此,結(jié)果要么是真要么是假,而絕不會(huì)是未知(NULL)。
Note: 如果比較兩個(gè)NULL值或一個(gè)NULL值和一個(gè)非NULL值,SQL 規(guī)范要求行式比較返回 NULL。 PostgreSQL這樣做僅當(dāng)兩行構(gòu)造的結(jié)果或一行構(gòu)造子句的輸出 (像這里Section 9.20)。在其它情況下,兩個(gè)復(fù)合型的值進(jìn)行比較,認(rèn)為兩NULL字段值是相等的,NULL大于非NULL。 這是必要的,才能有一致的排序和復(fù)合類(lèi)型的索引行為。