↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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
历史版本。 PostgreSQL 13 已结束支持。 2025-11-13. 请参阅 当前版本手册.

9.2. 比较函数和操作符 #

常见的比较操作符都可用,如表 9.1 所示。

表 9.1. 比较操作符

操作符描述
datatype < datatype → boolean 小于
datatype > datatype → boolean 大于
datatype <= datatype → boolean 小于等于
datatype >= datatype → boolean 大于等于
datatype = datatype → boolean 等于
datatype <> datatype → boolean 不等于
datatype != datatype → boolean 不等于

注意

<> 是“不等于”的标准 SQL 符号。!= 是一个别名,在解析的早期阶段就会被转换为 <>。因此,不可能让 != 和 <> 操作符执行不同的操作。

这些比较操作符适用于所有具有自然排序的内置数据类型,包括数值、字符串和日期/时间类型。此外,如果其组成数据类型具有可比性,则也可以比较数组、复合类型和范围。

通常也可以比较相关数据类型的值;例如 integer > bigint 将起作用。这种情况中的一部分直接由“跨类型”比较操作符实现;但如果没有这样的操作符,解析器就会把较不通用的类型强制转换为较通用的类型,并应用后者的比较操作符。

如上所示,所有比较操作符都是二元操作符,返回 boolean 类型的值。因此,类似 1 < 2 < 3 的表达式是无效的,因为没有<操作符可将 3 与布尔值比较。使用下面显示的 BETWEEN 谓词执行范围测试。

如表 9.2 所示,也有一些比较谓词。它们的行为和操作符很像,但是具有 SQL 标准所要求的特殊语法。

表 9.2. 比较谓词

谓词

描述

示例

datatype BETWEEN datatype AND datatype → boolean

位于两者之间(包括范围端点)。

2 BETWEEN 1 AND 3 → t

2 BETWEEN 3 AND 1 → f

datatype NOT BETWEEN datatype AND datatype → boolean

不在范围内(BETWEEN 的否定形式)

2 NOT BETWEEN 1 AND 3 → f

datatype BETWEEN SYMMETRIC datatype AND datatype → boolean

在对两个端点值排序之后判断是否在其间

2 BETWEEN SYMMETRIC 3 AND 1 → t

datatype NOT BETWEEN SYMMETRIC datatype AND datatype → boolean

在对两个端点值排序之后判断是否不在其间

2 NOT BETWEEN SYMMETRIC 3 AND 1 → f

datatype IS DISTINCT FROM datatype → boolean

不相等,将 null 视为可比值。

1 IS DISTINCT FROM NULL → t(而不是 NULL)

NULL IS DISTINCT FROM NULL → f(而不是 NULL)

datatype IS NOT DISTINCT FROM datatype → boolean

相等,将 null 视为可比值。

1 IS NOT DISTINCT FROM NULL → f(而不是 NULL)

NULL IS NOT DISTINCT FROM NULL → t(而不是 NULL)

datatype IS NULL → boolean

测试值是否为 null。

1.5 IS NULL → f

datatype IS NOT NULL → boolean

测试值是否不为 null。

'null' IS NOT NULL → t

datatype ISNULL → boolean

测试值是否为 null(非标准语法)。

datatype NOTNULL → boolean

测试值是否不为 null(非标准语法)。

boolean IS TRUE → boolean

测试布尔表达式是否为真。

true IS TRUE → t

NULL::boolean IS TRUE → f(而不是 NULL)

boolean IS NOT TRUE → boolean

测试布尔表达式是否为假或未知。

true IS NOT TRUE → f

NULL::boolean IS NOT TRUE → t(而不是 NULL)

boolean IS FALSE → boolean

测试布尔表达式是否为假。

true IS FALSE → f

NULL::boolean IS FALSE → f(而不是 NULL)

boolean IS NOT FALSE → boolean

测试布尔表达式是否为真或未知。

true IS NOT FALSE → t

NULL::boolean IS NOT FALSE → t(而不是 NULL)

boolean IS UNKNOWN → boolean

测试布尔表达式是否为未知。

true IS UNKNOWN → f

NULL::boolean IS UNKNOWN → t(而不是 NULL)

boolean IS NOT UNKNOWN → boolean

测试布尔表达式是否为真或假。

true IS NOT UNKNOWN → t

NULL::boolean IS NOT UNKNOWN → f(而不是 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(表示“未知”),而不是真或假。例如,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,它会返回假。而如果只有一个输入为 null,它会返回真。类似地,IS NOT DISTINCT FROM 对于非 null 输入的行为与=相同,但是当两个输入都为 null 时它返回真,并且当只有一个输入为 null 时返回假。因此,这些谓词实际上把 null 当作一种普通数据值,而不是“未知”。

要检查一个值是否为 null,使用下面的谓词:

expression IS NULL
expression IS NOT NULL

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

expression ISNULL
expression NOTNULL

不要写 expression = NULL,因为 NULL 并不“等于”NULL。(null 值表示未知值,而我们并不知道两个未知值是否相等。)

提示

有些应用可能期望表达式 expression = NULL 在 expression 求值为 null 时返回真。我们强烈建议此类应用修改为遵循 SQL 标准。但是,如果无法这样修改,那么可以使用配置变量 transform_null_equals。如果将其打开,PostgreSQL 会把 x = NULL 子句转换成 x IS NULL。

如果 expression 是行值,那么当行表达式本身为 null 或其所有字段都为 null 时,IS NULL 为真;而当行表达式本身非 null 且其所有字段都非 null 时,IS NOT NULL 为真。由于这种行为,IS NULL 和 IS NOT NULL 并不总是对行值表达式返回相反的结果;特别是,一个同时包含 null 和非 null 字段的行值表达式会对这两种测试都返回假。在某些情况下,写成 row IS DISTINCT FROM NULL 或者 row 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 也是如此。null 输入被当作逻辑值“未知”。请注意,IS UNKNOWN 和 IS NOT UNKNOWN 实际上分别等同于 IS NULL 和 IS 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


报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.