如表 9.1所示,提供了常規的比較運算子。
表 9.1. 比較運算子
運算子 | 描述 |
---|---|
資料型別 < 資料型別 → boolean |
小於 |
資料型別 > 資料型別 → boolean |
大於 |
資料型別 <= 資料型別 → boolean |
小於等於 |
資料型別 >= 資料型別 → boolean |
大於等於 |
資料型別 = 資料型別 → boolean |
等於 |
資料型別 <> 資料型別 → boolean |
不等於 |
資料型別 != 資料型別 → 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(表示“未知”),而不是 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 是普通資料值一樣進行處理,而不是“未知”。
expression
IS NULLexpression
IS NOT NULL
或等效的、但非標準的謂詞
expression
ISNULLexpression
NOTNULL
請不要寫
,因為 表示式
= NULLNULL
不“等於”NULL
。(NULL 值代表一個未知值,無法確定兩個未知值是否相等。)
某些應用程式可能期望
在 表示式
= NULL表示式
計算為 NULL 值時返回 TRUE。強烈建議修改這些應用程式以符合 SQL 標準。但是,如果無法做到這一點,可以使用 transform_null_equals 配置變數。如果啟用,PostgreSQL 會將 x = NULL
子句轉換為 x IS NULL
。
如果 表示式
是行值,則當行表示式本身為 NULL 或行中的所有欄位都為 NULL 時,IS NULL
為 TRUE;當行表示式非 NULL 且行中的所有欄位都非 NULL 時,IS NOT NULL
為 TRUE。由於這種行為,對於行值表示式,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
在某些情況下,最好使用 行
IS DISTINCT FROM NULL
或 行
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. 比較函式
如果您在文件中發現任何不正確之處,與您對特定功能的體驗不符,或者需要進一步澄清,請使用此表單報告文件問題。