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

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.3 已于 2018 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

9.23. 行和数组比较 #

本节描述几个特殊的结构,用于在值的组之间进行多重比较。这些形式语法上和前面一节的子查询形式相关,但是不涉及子查询。 涉及数组子表达式的形式是PostgreSQL的扩展; 其余形式是SQL兼容的。本节介绍的所有表达式形式都返回布尔(Boolean)结果(真/假)。

9.23.1. IN

expression IN (value [, ...])

右侧是一个用圆括号括起来的标量表达式列表。如果左侧表达式的结果等于右侧任一表达式的结果,则结果为。这等价于以下写法:

expression = value1
OR
expression = value2
OR
...

请注意如果左手边表达式得到空值,或者没有相等的右手边值并且至少有一个右手边的表达式得到空值,那么IN结构的结果将为空值,而不是假。这符合 SQL 处理空值的布尔组合的一般规则。

9.23.2. NOT IN

expression NOT IN (value [, ...])

右侧是一个用圆括号括起来的标量表达式列表。如果左侧表达式的结果与右侧所有表达式的结果都不相等,则结果为。这等价于以下写法:

expression <> value1
AND
expression <> value2
AND
...

请注意如果左手边表达式得到空值,或者没有相等的右手边值并且至少有一个右手边的表达式得到空值,那么NOT IN结构的结果将为空值, 而不是我们可能天真地认为的真值。这符合 SQL 处理空值的布尔组合的一般规则。

提示

x NOT IN y在所有情况下都等效于NOT (x IN y)。但是,在处理空值的时候,用NOT IN比用IN更可能迷惑新手。最好尽可能用正逻辑来表达你的条件。

9.23.3. ANY/SOME(数组)

expression operator ANY (array expression)
expression operator SOME (array expression)

右侧是一个用括号括起来的表达式,它必须产生一个数组值。左侧表达式会被求值,并使用给定的operator与数组的每个元素进行比较,该操作符必须产生布尔结果。如果得到了任何真值结果,那么ANY的结果是。如果没有找到真值结果(包括数组有零个元素的情况),那么结果是

如果数组表达式得到的是 null 数组,那么ANY的结果将为 null。如果左手边的表达式得到 null,ANY通常也为 null(尽管非严格比较操作符可能得到不同结果)。另外,如果右手边数组包含任何 null 元素,并且没有得到真值比较结果,那么ANY的结果将为 null 而不是假(同样假设这里使用的是严格比较操作符)。这符合 SQL 处理 null 值布尔组合的一般规则。

SOMEANY的同义词。

9.23.4. ALL(数组)

expression operator ALL (array expression)

右侧是一个用括号括起来的表达式,它必须产生一个数组值。左侧表达式会被求值,并使用给定的operator与数组的每个元素进行比较,该操作符必须产生布尔结果。如果所有比较都得到真值结果,那么ALL的结果是(包括数组有零个元素的情况)。如果有任何假值结果,那么结果是

如果数组表达式得到的是 null 数组,那么ALL的结果将为 null。如果左手边的表达式得到 null,ALL通常也为 null(尽管非严格比较操作符可能得到不同结果)。另外,如果右手边数组包含任何 null 元素,并且没有得到假值比较结果,那么ALL的结果将为 null 而不是真(同样假设这里使用的是严格比较操作符)。这符合 SQL 处理 null 值布尔组合的一般规则。

9.23.5. 行构造器比较 #

row_constructor operator row_constructor

两侧都是行构造器,如第 4.2.13 节所述。两个行值必须具有相同数量的字段。对两侧分别求值后,按行进行比较。当 operator=<><<=>>= 时,或具有与其中之一类似的语义时,允许进行行比较。(具体来说,如果一个操作符是某个 B-树操作符类的成员,或者是某个 B-树操作符类的 = 成员的否定者,那么它就可以用作行比较操作符。)

=<>情况略有不同。如果两行的所有对应成员都是非空且相等则这两行被认为相等;如果任何对应成员是非空但是不相等则这两行不相等;否则行比较的结果为未知(空值)。

对于<<=>>=这几种情况,会从左到右比较各行元素,一旦找到一对不相等或含有 null 的元素就立即停止。如果这对元素中的任意一个为 null,那么行比较的结果就是未知(null);否则,这对元素的比较结果决定整个行比较的结果。例如,ROW(1,2,NULL) < ROW(1,3,0)的结果为真,而不是 null,因为第三对元素并不会被考虑。

注意

PostgreSQL 8.2 之前,<<=>>=这几种情况并不是按照 SQL 规范处理的。像ROW(a,b) < ROW(c,d)这样的比较会被实现为a < c AND b < d,而正确行为应当等价于a < c OR (a = c AND b < d)

row_constructor IS DISTINCT FROM row_constructor

这个结构与<>行比较相似,但是它对于空值输入不会得到空值。任何空值被认为和任何非空值不相等(有区别),并且任意两个空值被认为相等(无区别)。因此结果将总是为真或为假,永远不会是空值。

row_constructor IS NOT DISTINCT FROM row_constructor

这个结构与=行比较相似,但是它对于空值输入不会得到空值。任何空值被认为和任何非空值不相等(有区别),并且任意两个空值被认为相等(无区别)。因此结果将总是为真或为假,永远不会是空值。

注意

SQL 规范要求,当行值比较的结果依赖于两个 NULL 值或一个 NULL 和一个非 NULL 值的比较时,返回 NULL。 PostgreSQL只在比较两个行构造器的结果或比较行构造器与子查询输出(如第 9.22 节中那样)时才这样做。 在比较两个组合类型值的其他上下文中,两个 NULL 字段值被视为相等,且 NULL 被视为大于非 NULL。 这是为了让组合类型具有一致的排序和索引行为。

提交更正

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