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

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
历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.

9.17. 行和数组比较 #

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

9.17.1. IN

expression IN (value[, ...])

右侧是一个用圆括号括起来的标量表达式列表。如果左侧表达式的结果等于任何一个右侧表达式的结果,则结果为“真”。这是

expression = value1
OR
expression = value2
OR
...

的简写形式。

注意,如果左侧表达式产生 null,或者不存在相等的右侧值且至少有一个右侧表达式产生 null,则IN结构的结果将是 null 而不是假。这符合 SQL 对空值布尔组合的正常规则。

9.17.2. NOT IN

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

右侧是一个用圆括号括起来的标量表达式列表。如果左侧表达式的结果与所有右侧表达式的结果都不相等,则结果为“真”。这是

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

的简写形式。

注意,如果左侧表达式产生 null,或者不存在相等的右侧值且至少有一个右侧表达式产生 null,则NOT IN结构的结果将是 null,而不是人们可能天真期望的真。这符合 SQL 对空值布尔组合的正常规则。

提示

x NOT IN y在任何情况下都等价于NOT (x IN y)。不过,对新手来说,使用NOT IN时 null 值比使用IN时更容易造成困扰。最好尽可能用肯定的形式表达你的条件。

9.17.3. ANY/SOME(数组)

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

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

SOME是ANY的同义词。

9.17.4. ALL(数组)

expression operator ALL (array expression)

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

9.17.5. 按行比较

(expression [, expression ...]) operator (expression [, expression ...])

每一边都是标量表达式的列表;两个列表的长度必须相同。对两边求值后逐行比较。目前,逐行比较中只允许使用 = 和 <> 操作符。相应地,如果这两行相等或不相等,结果为“真”。

和通常一样,行中的空值按照 SQL 布尔表达式的正常规则进行组合。如果两个行的所有对应成员都非空且相等,则认为两行相等;如果任何对应成员非空且不相等,则两行不相等;否则该行比较的结果为未知(null)。

报告文档问题

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