支持的版本: 当前 (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 或未知。

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 或未知。

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 或 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,请使用谓词

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 是行值,则当行表达式本身为 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

在某些情况下,最好编写 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

返回非 null 参数的数量。

num_nonnulls(1, NULL, 2)2

num_nulls ( VARIADIC "any" ) → integer

返回 null 参数的数量。

num_nulls(1, NULL, 2)1


提交更正

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