选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.6 已于 2021 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

9.2. 比较函数和操作符 #

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

表 9.1. 比较操作符

操作符 描述
< 小于
> 大于
<= 小于或等于
>= 大于或等于
= 等于
<>!= 不等于

注意

!= 操作符在解析器阶段会转换为 <>。不可能实现行为不同的 !=<> 操作符。

比较操作符适用于所有相关的数据类型。所有比较操作符都是返回 boolean 类型值的二元操作符;类似 1 < 2 < 3 的表达式是无效的(因为没有用于比较布尔值和 3< 操作符)。

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

表 9.2. 比较谓词

谓词 描述
a BETWEEN x AND y 位于两者之间
a NOT BETWEEN x AND y 不位于两者之间
a BETWEEN SYMMETRIC x AND y 对比较值排序后,位于两者之间
a NOT BETWEEN SYMMETRIC x AND y 对比较值排序后,不位于两者之间
a IS DISTINCT FROM b 不等于,将 null 视为普通值
a IS NOT DISTINCT FROM b 等于,将 null 视为普通值
expression IS NULL 为 null
expression IS NOT NULL 不为 null
expression ISNULL 为 null(非标准语法)
expression NOTNULL 不为 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 为真或假

BETWEEN谓词可以简化范围测试:

a BETWEEN x AND y

等价于

a >= x AND a <= y

注意,BETWEEN将两个端点值都视为包含在范围内。NOT BETWEEN执行相反的比较:

a NOT BETWEEN x AND y

等价于

a < x OR a > y

BETWEEN SYMMETRIC类似于BETWEEN,但不要求AND左侧的参数小于或等于右侧的参数。如果不是这样,这两个参数会自动交换,以确保表示的范围始终非空。

当任一输入为 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 = NULLexpression求值为 null 时返回真。我们强烈建议此类应用修改为遵循 SQL 标准。但是,如果无法这样修改,那么可以使用配置变量transform_null_equals。如果将其打开,PostgreSQL会把x = NULL子句转换成x IS NULL

如果expression是行值,那么当行表达式本身为 null 或其所有字段都为 null 时,IS NULL 为真;而当行表达式本身非 null 且其所有字段都非 null 时,IS NOT NULL 为真。由于这种行为,IS NULLIS 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 UNKNOWNIS NOT UNKNOWN实际上分别等同于IS NULLIS NOT NULL,只是输入表达式必须是布尔类型。

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

表 9.3. 比较函数

函数 描述 示例 示例结果
num_nonnulls(VARIADIC "any") 返回非 null 参数的数量 num_nonnulls(1, NULL, 2) 2
num_nulls(VARIADIC "any") 返回 null 参数的数量 num_nulls(1, NULL, 2) 1

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。