常用的比較運算符可用,如表 9.1所示。
表 9.1. 比較運算符
運算符 | 描述 |
---|---|
datatype < datatype → boolean |
小於 |
datatype > datatype → boolean |
大於 |
datatype <= datatype → boolean |
小於或等於 |
datatype >= datatype → boolean |
大於或等於 |
datatype = datatype → boolean |
等於 |
datatype <> datatype → boolean |
不等於 |
datatype != datatype → boolean |
不等於 |
<>
是「不等於」的標準 SQL 符號。!=
是一個別名,在解析的早期階段會轉換為<>
。因此,無法實作執行不同操作的!=
和<>
運算符。
這些比較運算符適用於所有具有自然排序的內建資料類型,包括數值、字串和日期/時間類型。此外,如果陣列、複合類型和範圍的組成資料類型可以比較,則也可以比較它們。
通常也可以比較相關資料類型的值;例如,integer
>
bigint
將起作用。這種情況的某些實例由「跨類型」比較運算符直接實作,但如果沒有此類運算符可用,則解析器會將較不通用的類型強制轉換為較通用的類型,並應用後者的比較運算符。
如上所示,所有比較運算符都是二元運算符,它們會傳回boolean
類型的值。因此,1 < 2 < 3
等表示式無效(因為沒有<
運算符可將布林值與3
進行比較)。請使用下面顯示的BETWEEN
述詞來執行範圍測試。
還有一些比較述詞,如表 9.2所示。它們的行為很像運算符,但具有 SQL 標準強制規定的特殊語法。
表 9.2. 比較述詞
述詞 描述 範例 |
---|
介於(包含範圍端點)。
|
不介於(
|
介於,在對兩個端點值排序之後。
|
在排序兩個端點值後判斷是否不在範圍內。
|
不相等,將 null 視為可比較的數值。
|
相等,將 null 視為可比較的數值。
|
測試值是否為 null。
|
測試值是否不為 null。
|
測試值是否為 null (非標準語法)。 |
測試值是否不為 null (非標準語法)。 |
測試布林運算式是否產生 true。
|
測試布林運算式是否產生 false 或 unknown。
|
測試布林運算式是否產生 false。
|
測試布林運算式是否產生 true 或 unknown。
|
測試布林運算式是否產生 unknown。
|
測試布林運算式是否產生 true 或 false。
|
a
BETWEENx
ANDy
等同於
a
>=x
ANDa
<=y
請注意,BETWEEN
將端點值視為包含在範圍內。BETWEEN SYMMETRIC
類似於 BETWEEN
,只是不要求 AND
左側的引數小於或等於右側的引數。如果不是,這兩個引數會自動交換,以便始終暗示一個非空的範圍。
BETWEEN
的各種變體是根據普通的比較運算符實現的,因此適用於任何可以比較的資料類型。
在 BETWEEN
語法中使用 AND
會與使用 AND
作為邏輯運算符產生歧義。為了消除這種歧義,只允許有限的表達式類型作為 BETWEEN
子句的第二個引數。 如果您需要在 BETWEEN
中編寫更複雜的子表達式,請在子表達式周圍加上括號。
當任何一個輸入為 null 時,普通的比較運算符會產生 null(表示 「unknown」),而不是 true 或 false。 例如,7 = NULL
產生 null,7 <> NULL
也是如此。 當此行為不合適時,請使用 IS [ NOT ] DISTINCT FROM
述詞
a
IS DISTINCT FROMb
a
IS NOT DISTINCT FROMb
對於非 null 輸入,IS DISTINCT FROM
與 <>
運算符相同。 但是,如果兩個輸入都是 null,則它返回 false,如果只有一個輸入是 null,則它返回 true。 類似地,對於非 null 輸入,IS NOT DISTINCT FROM
與 =
相同,但如果兩個輸入都是 null,則它返回 true,而如果只有一個輸入是 null,則它返回 false。 因此,這些述詞有效地表現得好像 null 是一個正常的資料值,而不是 「unknown」。
expression
IS NULLexpression
IS NOT NULL
或等效但非標準的述詞
expression
ISNULLexpression
NOTNULL
請勿編寫
,因為 expression
= NULLNULL
不 「等於」 NULL
。(null 值表示未知值,並且不知道兩個未知值是否相等。)
某些應用程式可能期望,如果 expression
評估為 null 值,則
會返回 true。 強烈建議修改這些應用程式,使其符合 SQL 標準。 但是,如果無法做到這一點,可以使用 transform_null_equals 配置變數。 如果啟用此變數,PostgreSQL 會將 expression
= NULLx = NULL
子句轉換為 x IS NULL
。
如果 expression
是 row-valued (列值),當列的表達式本身為 null,或者列的所有欄位都是 null 時,IS NULL
為真。而當列的表達式本身非 null,且列的所有欄位都非 null 時,IS NOT NULL
為真。由於這種行為,IS NULL
和 IS NOT NULL
並不總是為列值表達式返回相反的結果;特別是,一個包含 null 和非 null 欄位的列值表達式,對於這兩種測試都會返回 false。例如:
SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same'); SELECT ROW(table.*) IS NULL FROM table; -- detect all-null rows SELECT ROW(table.*) IS NOT NULL FROM table; -- detect all-non-null rows SELECT NOT(ROW(table.*) IS NOT NULL) FROM TABLE; -- detect at least one null in rows
在某些情況下,最好使用 row
IS DISTINCT FROM NULL
或 row
IS NOT DISTINCT FROM NULL
,這將簡單地檢查整個列的值是否為 null,而不會對列的欄位進行任何額外的測試。
boolean_expression
IS TRUEboolean_expression
IS NOT TRUEboolean_expression
IS FALSEboolean_expression
IS NOT FALSEboolean_expression
IS UNKNOWNboolean_expression
IS NOT UNKNOWN
即使運算元為 null,這些謂詞也總是返回 true 或 false,絕不會返回 null 值。一個 null 輸入被視為邏輯值 “未知”。請注意,IS UNKNOWN
和 IS NOT UNKNOWN
實際上與 IS NULL
和 IS NOT NULL
相同,只是輸入表達式必須為布林類型。
一些與比較相關的函數也可用,如 表 9.3 所示。
表 9.3. 比較函數
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。