pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节描述几个特殊的结构,用于在值的组之间进行多重比较。这些形式语法上和前面一节的子查询形式相关,但是不涉及子查询。涉及数组子表达式的形式是PostgreSQL的扩展;其余形式是SQL兼容的。本节介绍的所有表达式形式都返回布尔(Boolean)结果(真/假)。
INexpressionIN (value[, ...])
右侧是一个用圆括号括起来的标量表达式列表。如果左侧表达式的结果等于任何一个右侧表达式的结果,则结果为“真”。这是
expression=value1ORexpression=value2OR ...
的简写形式。
注意,如果左侧表达式产生 null,或者不存在相等的右侧值且至少有一个右侧表达式产生 null,则IN结构的结果将是 null 而不是假。这符合 SQL 对空值布尔组合的正常规则。
NOT INexpressionNOT IN (value[, ...])
右侧是一个用圆括号括起来的标量表达式列表。如果左侧表达式的结果与所有右侧表达式的结果都不相等,则结果为“真”。这是
expression<>value1ANDexpression<>value2AND ...
的简写形式。
注意,如果左侧表达式产生 null,或者不存在相等的右侧值且至少有一个右侧表达式产生 null,则NOT IN结构的结果将是 null,而不是人们可能天真期望的真。这符合 SQL 对空值布尔组合的正常规则。
x NOT IN y在任何情况下都等价于NOT (x IN y)。不过,对新手来说,使用NOT IN时 null 值比使用IN时更容易造成困扰。最好尽可能用肯定的形式表达你的条件。
ANY/SOME(数组)expressionoperatorANY (array expression)expressionoperatorSOME (array expression)
右侧是一个用圆括号括起来的表达式,它必须产生一个数组值。左侧表达式会被求值,并使用给定的operator与数组的每个元素进行比较。该操作符必须产生布尔结果。如果得到任何真值结果,则ANY的结果为“真”。如果没有找到真值结果(包括数组有零个元素的情况),则结果为“假”。
SOME是ANY的同义词。
ALL(数组)expressionoperatorALL (array expression)
右侧是一个用圆括号括起来的表达式,它必须产生一个数组值。左侧表达式会被求值,并使用给定的operator与数组的每个元素进行比较。该操作符必须产生布尔结果。如果所有比较都得到真(包括数组有零个元素的情况),则ALL的结果为“真”。如果找到任何假值结果,则结果为“假”。
row_constructoroperatorrow_constructor
两侧都是行构造器,如第 4.2.11 节所述。两个行值的字段数必须相同。对两侧分别求值后,按行进行比较。目前,行式比较中只允许使用=和<>操作符。如果两行分别相等或不相等,则结果为“真”。
和通常一样,行中的空值按照 SQL 布尔表达式的正常规则进行组合。如果两个行的所有对应成员都非空且相等,则认为两行相等;如果任何对应成员非空且不相等,则两行不相等;否则该行比较的结果为未知(null)。
row_constructorIS DISTINCT FROMrow_constructor
这个结构与<>行比较相似,但是它对于空值输入不会得到空值。任何空值被认为和任何非空值不相等(有区别),并且任意两个空值被认为相等(无区别)。因此结果将总是为真或为假,永远不会是空值。
row_constructorIS NULLrow_constructorIS NOT NULL
这些结构测试一个行值是否为 null 或非 null。如果一个行值至少有一个字段不为 null,则认为它是非 null 的。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。