2024 年 9 月 26 日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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 IS TRUEt

NULL::boolean IS TRUEf(而不是 NULL

boolean IS NOT TRUEboolean

测试布尔表达式是否产生假值或未知值。

true IS NOT TRUEf

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

boolean IS FALSEboolean

测试布尔表达式是否产生假值。

true IS FALSEf

NULL::boolean IS FALSEf(而不是 NULL

boolean IS NOT FALSEboolean

测试布尔表达式是否产生真值或未知值。

true IS NOT FALSEt

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

boolean IS UNKNOWNboolean

测试布尔表达式是否产生未知值。

true IS UNKNOWNf

NULL::boolean IS UNKNOWNt(而不是 NULL

boolean IS NOT UNKNOWNboolean

测试布尔表达式是否产生真值或假值。

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

对于非空输入,IS DISTINCT FROM 等同于 <> 运算符。但是,如果两个输入都是 null,它将返回 false,如果只有一个输入是 null,它将返回 true。类似地,IS NOT DISTINCT FROM 对于非空输入与 = 相同,但当两个输入都是 null 时返回 true,当只有一个输入是 null 时返回 false。因此,这些谓词有效地将 null 视为一个正常的数值,而不是 未知

为了检查一个值是否为 null 或不为 null,可以使用以下谓词

expression IS NULL
expression IS NOT NULL

或者等效的,但非标准的谓词

expression ISNULL
expression NOTNULL

不要expression = NULL,因为 NULL等于 NULL。(null 值表示一个未知的值,不知道两个未知的值是否相等。)

提示

一些应用程序可能会期望 expression = NULLexpression 评估为 null 值时返回 true。强烈建议修改这些应用程序以符合 SQL 标准。但是,如果无法做到这一点,可以使用 transform_null_equals 配置变量。如果启用它,PostgreSQL 会将 x = NULL 子句转换为 x IS NULL

如果 expression 是行值的,那么 IS NULL 在行表达式本身为 null 或者行的所有字段都为 null 时为 true,而 IS NOT NULL 在行表达式本身不为 null 并且行的所有字段都不为 null 时为 true。由于这种行为,IS NULLIS NOT 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

这些将始终返回 true 或 false,绝不返回 null 值,即使操作数为 null。null 输入将被视为逻辑值 未知。请注意,IS UNKNOWNIS NOT UNKNOWN 实际上与 IS NULLIS NOT NULL 相同,只是输入表达式必须是布尔类型。

一些与比较相关的函数也可用,如 表 9.3 所示。

表 9.3. 比较函数

函数

描述

示例

num_nonnulls ( VARIADIC "any" ) → integer

返回非空参数的数量。

num_nonnulls(1, NULL, 2)2

num_nulls ( VARIADIC "any" ) → integer

返回 null 参数的数量。

num_nulls(1, NULL, 2)1


提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表格 报告文档问题。