2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

9.2. 比較函式和運算子 #

表 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. 比較謂詞

謂詞

描述

示例

資料型別 BETWEEN 資料型別 AND 資料型別boolean

在…之間(包含範圍的端點)。

2 BETWEEN 1 AND 3t

2 BETWEEN 3 AND 1f

資料型別 NOT BETWEEN 資料型別 AND 資料型別boolean

不在…之間(BETWEEN 的否定)。

2 NOT BETWEEN 1 AND 3f

資料型別 BETWEEN SYMMETRIC 資料型別 AND 資料型別boolean

在…之間,對兩個端點值進行排序後。

2 BETWEEN SYMMETRIC 3 AND 1t

資料型別 NOT BETWEEN SYMMETRIC 資料型別 AND 資料型別boolean

不在…之間,對兩個端點值進行排序後。

2 NOT BETWEEN SYMMETRIC 3 AND 1f

資料型別 IS DISTINCT FROM 資料型別boolean

不等於,將 NULL 視為可比較的值。

1 IS DISTINCT FROM NULLt(而不是 NULL

NULL IS DISTINCT FROM NULLf(而不是 NULL

資料型別 IS NOT DISTINCT FROM 資料型別boolean

等於,將 NULL 視為可比較的值。

1 IS NOT DISTINCT FROM NULLf(而不是 NULL

NULL IS NOT DISTINCT FROM NULLt(而不是 NULL

資料型別 IS NULLboolean

測試值是否為 NULL。

1.5 IS NULLf

資料型別 IS NOT NULLboolean

測試值是否不為 NULL。

'null' IS NOT NULLt

資料型別 ISNULLboolean

測試值是否為 NULL(非標準語法)。

資料型別 NOTNULLboolean

測試值是否不為 NULL(非標準語法)。

boolean IS TRUEboolean

測試布林表示式是否結果為 TRUE。

true IS TRUEt

NULL::boolean IS TRUEf(而不是 NULL

boolean IS NOT TRUEboolean

測試布林表示式是否結果為 FALSE 或 UNKNOWN。

true IS NOT TRUEf

NULL::boolean IS NOT TRUEt(而不是 NULL

boolean IS FALSEboolean

測試布林表示式是否結果為 FALSE。

true IS FALSEf

NULL::boolean IS FALSEf(而不是 NULL

boolean IS NOT FALSEboolean

測試布林表示式是否結果為 TRUE 或 UNKNOWN。

true IS NOT FALSEt

NULL::boolean IS NOT FALSEt(而不是 NULL

boolean IS UNKNOWNboolean

測試布林表示式是否結果為 UNKNOWN。

true IS UNKNOWNf

NULL::boolean IS UNKNOWNt(而不是 NULL

boolean IS NOT UNKNOWNboolean

測試布林表示式是否結果為 TRUE 或 FALSE。

true IS NOT UNKNOWNt

NULL::boolean IS NOT UNKNOWNf(而不是 NULL


BETWEEN 謂詞簡化了範圍測試

a BETWEEN x AND y

等同於

a >= x AND a <= 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 FROM b
a IS NOT DISTINCT FROM b

對於非 NULL 輸入,IS DISTINCT FROM<> 運算子相同。但是,如果兩個輸入都為 NULL,它將返回 FALSE;如果只有一個輸入為 NULL,它將返回 TRUE。類似地,對於非 NULL 輸入,IS NOT DISTINCT FROM= 相同,但當兩個輸入都為 NULL 時它返回 TRUE,當只有一個輸入為 NULL 時它返回 FALSE。因此,這些謂詞有效地像 NULL 是普通資料值一樣進行處理,而不是“未知”。

要檢查一個值是否為 NULL 或非 NULL,請使用謂詞

expression IS NULL
expression IS NOT NULL

或等效的、但非標準的謂詞

expression ISNULL
expression NOTNULL

不要表示式 = NULL,因為 NULL 不“等於”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 NULLIS 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 TRUE
boolean_expression IS NOT TRUE
boolean_expression IS FALSE
boolean_expression IS NOT FALSE
boolean_expression IS UNKNOWN
boolean_expression IS NOT UNKNOWN

即使運算元為 NULL,這些謂詞也總是返回 TRUE 或 FALSE,絕不會返回 NULL 值。NULL 輸入被視為邏輯值“未知”。請注意,IS UNKNOWNIS NOT UNKNOWN 在功能上分別等同於 IS NULLIS NOT NULL,只是輸入表示式必須是布林型別。

一些與比較相關的函式也可用,如表 9.3所示。

表 9.3. 比較函式

函式

描述

示例

num_nonnulls ( VARIADIC "any" ) → integer

返回非 NULL 引數的數量。

num_nonnulls(1, NULL, 2)2

num_nulls ( VARIADIC "any" ) → integer

返回 NULL 引數的數量。

num_nulls(1, NULL, 2)1


提交更正

如果您在文件中發現任何不正確之處,與您對特定功能的體驗不符,或者需要進一步澄清,請使用此表單報告文件問題。