支援的版本:目前版本 (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. 比較運算符

運算符 描述
datatype < datatypeboolean 小於
datatype > datatypeboolean 大於
datatype <= datatypeboolean 小於或等於
datatype >= datatypeboolean 大於或等於
datatype = datatypeboolean 等於
datatype <> datatypeboolean 不等於
datatype != datatypeboolean 不等於

注意

<>不等於的標準 SQL 符號。!=是一個別名,在解析的早期階段會轉換為<>。因此,無法實作執行不同操作的!=<>運算符。

這些比較運算符適用於所有具有自然排序的內建資料類型,包括數值、字串和日期/時間類型。此外,如果陣列、複合類型和範圍的組成資料類型可以比較,則也可以比較它們。

通常也可以比較相關資料類型的值;例如,integer > bigint 將起作用。這種情況的某些實例由跨類型比較運算符直接實作,但如果沒有此類運算符可用,則解析器會將較不通用的類型強制轉換為較通用的類型,並應用後者的比較運算符。

如上所示,所有比較運算符都是二元運算符,它們會傳回boolean類型的值。因此,1 < 2 < 3等表示式無效(因為沒有<運算符可將布林值與3進行比較)。請使用下面顯示的BETWEEN述詞來執行範圍測試。

還有一些比較述詞,如表 9.2所示。它們的行為很像運算符,但具有 SQL 標準強制規定的特殊語法。

表 9.2. 比較述詞

述詞

描述

範例

datatype BETWEEN datatype AND datatypeboolean

介於(包含範圍端點)。

2 BETWEEN 1 AND 3t

2 BETWEEN 3 AND 1f

datatype NOT BETWEEN datatype AND datatypeboolean

不介於(BETWEEN的否定)。

2 NOT BETWEEN 1 AND 3f

datatype BETWEEN SYMMETRIC datatype AND datatypeboolean

介於,在對兩個端點值排序之後。

2 BETWEEN SYMMETRIC 3 AND 1t

datatype NOT BETWEEN SYMMETRIC datatype AND datatypeboolean

在排序兩個端點值後判斷是否不在範圍內。

2 NOT BETWEEN SYMMETRIC 3 AND 1f

datatype IS DISTINCT FROM datatypeboolean

不相等,將 null 視為可比較的數值。

1 IS DISTINCT FROM NULLt (而不是 NULL)

NULL IS DISTINCT FROM NULLf (而不是 NULL)

datatype IS NOT DISTINCT FROM datatypeboolean

相等,將 null 視為可比較的數值。

1 IS NOT DISTINCT FROM NULLf (而不是 NULL)

NULL IS NOT DISTINCT FROM NULLt (而不是 NULL)

datatype IS NULLboolean

測試值是否為 null。

1.5 IS NULLf

datatype IS NOT NULLboolean

測試值是否不為 null。

'null' IS NOT NULLt

datatype ISNULLboolean

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

datatype 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(表示 unknown),而不是 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 是一個正常的資料值,而不是 unknown

若要檢查值是否為 null,請使用以下述詞

expression IS NULL
expression IS NOT NULL

或等效但非標準的述詞

expression ISNULL
expression NOTNULL

編寫 expression = NULL,因為 NULL等於 NULL。(null 值表示未知值,並且不知道兩個未知值是否相等。)

提示

某些應用程式可能期望,如果 expression 評估為 null 值,則 expression = NULL 會返回 true。 強烈建議修改這些應用程式,使其符合 SQL 標準。 但是,如果無法做到這一點,可以使用 transform_null_equals 配置變數。 如果啟用此變數,PostgreSQL 會將 x = NULL 子句轉換為 x IS NULL

如果 expression 是 row-valued (列值),當列的表達式本身為 null,或者列的所有欄位都是 null 時,IS NULL 為真。而當列的表達式本身非 null,且列的所有欄位都非 null 時,IS NOT NULL 為真。由於這種行為,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

在某些情況下,最好使用 row IS DISTINCT FROM NULLrow 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


提交更正

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