如表 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。
|
aBETWEENxANDy
等同於
a>=xANDa<=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 謂詞。
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
對於非 NULL 輸入,IS DISTINCT FROM 與 <> 運算子相同。但是,如果兩個輸入都為 NULL,它將返回 FALSE;如果只有一個輸入為 NULL,它將返回 TRUE。類似地,對於非 NULL 輸入,IS NOT DISTINCT FROM 與 = 相同,但當兩個輸入都為 NULL 時它返回 TRUE,當只有一個輸入為 NULL 時它返回 FALSE。因此,這些謂詞有效地像 NULL 是普通資料值一樣進行處理,而不是“未知”。
expressionIS NULLexpressionIS NOT NULL
或等效的、但非標準的謂詞
expressionISNULLexpressionNOTNULL
請不要寫 ,因為 表示式 = 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_expressionIS TRUEboolean_expressionIS NOT TRUEboolean_expressionIS FALSEboolean_expressionIS NOT FALSEboolean_expressionIS UNKNOWNboolean_expressionIS NOT UNKNOWN
即使運算元為 NULL,這些謂詞也總是返回 TRUE 或 FALSE,絕不會返回 NULL 值。NULL 輸入被視為邏輯值“未知”。請注意,IS UNKNOWN 和 IS NOT UNKNOWN 在功能上分別等同於 IS NULL 和 IS NOT NULL,只是輸入表示式必須是布林型別。
一些與比較相關的函式也可用,如表 9.3所示。
表 9.3. 比較函式
如果您在文件中發現任何不正確之處,與您對特定功能的體驗不符,或者需要進一步澄清,請使用此表單報告文件問題。