本节描述几种专门的结构,用于在多组值之间进行多重比较。这些形式在语法上与上一节的子查询形式相关,但不涉及子查询。涉及数组子表达式的形式是 PostgreSQL 扩展;其余的是SQL-兼容的。本节中记录的所有表达式形式都返回布尔(真/假)结果。
IN
#expression
IN (value
[, ...])
右侧是用括号括起来的表达式列表。如果左侧表达式的结果等于任何右侧表达式,则结果为 “真”。这是以下内容的简写表示法:
expression
=value1
ORexpression
=value2
OR ...
请注意,如果左侧表达式产生 null,或者如果没有相等的右侧值并且至少有一个右侧表达式产生 null,则 IN
构造的结果将为 null,而不是 false。这符合 SQL 关于 null 值的布尔组合的正常规则。
NOT IN
#expression
NOT IN (value
[, ...])
右侧是用括号括起来的表达式列表。如果左侧表达式的结果与所有右侧表达式都不相等,则结果为 “真”。这是以下内容的简写表示法:
expression
<>value1
ANDexpression
<>value2
AND ...
请注意,如果左侧表达式产生 null,或者如果没有相等的右侧值并且至少有一个右侧表达式产生 null,则 NOT IN
构造的结果将为 null,而不是像人们可能天真地期望的那样为 true。这符合 SQL 关于 null 值的布尔组合的正常规则。
在所有情况下,x NOT IN y
等效于 NOT (x IN y)
。但是,与使用 IN
相比,使用 NOT IN
时,null 值更容易让新手出错。如果可能,最好以肯定的方式表达您的条件。
ANY
/SOME
(数组) #expression
operator
ANY (array expression
)expression
operator
SOME (array expression
)
右侧是用括号括起来的表达式,它必须产生数组值。计算左侧表达式,并使用给定的 操作符
与数组的每个元素进行比较,该操作符必须产生布尔结果。如果获得任何 true 结果,则 ANY
的结果为 “真”。如果没有找到 true 结果(包括数组有零个元素的情况),则结果为 “假”。
如果数组表达式产生 null 数组,则 ANY
的结果将为 null。如果左侧表达式产生 null,则 ANY
的结果通常为 null(尽管非严格比较操作符可能会产生不同的结果)。此外,如果右侧数组包含任何 null 元素,并且未获得 true 比较结果,则 ANY
的结果将为 null,而不是 false(再次假设是严格比较操作符)。这符合 SQL 关于 null 值的布尔组合的正常规则。
SOME
是 ANY
的同义词。
ALL
(数组) #expression
operator
ALL (array expression
)
右侧是用括号括起来的表达式,它必须产生数组值。计算左侧表达式,并使用给定的 操作符
与数组的每个元素进行比较,该操作符必须产生布尔结果。如果所有比较都产生 true 结果(包括数组有零个元素的情况),则 ALL
的结果为 “真”。如果找到任何 false 结果,则结果为 “假”。
如果数组表达式产生 null 数组,则 ALL
的结果将为 null。如果左侧表达式产生 null,则 ALL
的结果通常为 null(尽管非严格比较操作符可能会产生不同的结果)。此外,如果右侧数组包含任何 null 元素,并且未获得 false 比较结果,则 ALL
的结果将为 null,而不是 true(再次假设是严格比较操作符)。这符合 SQL 关于 null 值的布尔组合的正常规则。
row_constructor
operator
row_constructor
每一侧都是一个行构造器,如 第 4.2.13 节中所述。两个行构造器必须具有相同数量的字段。给定的 操作符
将应用于每一对对应的字段。(由于字段可能具有不同的类型,这意味着可以为每对选择不同的特定操作符。)所有选定的操作符都必须是某个 B 树操作符类的成员,或者是 B 树操作符类的 =
成员的否定符,这意味着只有当 操作符
是 =
、<>
、<
、<=
、>
或 >=
时,或者具有与其中之一类似的语义时,才可能进行行构造器比较。
=
和 <>
的情况与其他情况略有不同。如果所有对应的成员都为非 null 且相等,则认为两行相等;如果任何对应的成员为非 null 且不相等,则认为两行不相等;否则,行比较的结果是未知的(null)。
对于 <
、<=
、>
和 >=
的情况,从左到右比较行元素,一旦找到不相等或 null 的元素对就停止。如果这对元素中的任何一个为 null,则行比较的结果是未知的(null);否则,这对元素的比较决定结果。例如,ROW(1,2,NULL) < ROW(1,3,0)
产生 true,而不是 null,因为不考虑第三对元素。
row_constructor
IS DISTINCT FROMrow_constructor
此构造类似于 <>
行比较,但它不会为 null 输入产生 null。相反,任何 null 值都被认为与任何非 null 值不相等(不同),并且任何两个 null 值都被认为相等(不不同)。因此,结果将为 true 或 false,永远不会为 null。
row_constructor
IS NOT DISTINCT FROMrow_constructor
此构造类似于 =
行比较,但它不会为 null 输入产生 null。相反,任何 null 值都被认为与任何非 null 值不相等(不同),并且任何两个 null 值都被认为相等(不不同)。因此,结果将始终为 true 或 false,永远不会为 null。
record
operator
record
SQL 规范要求,如果结果取决于比较两个 NULL 值或一个 NULL 和一个非 NULL 值,则逐行比较返回 NULL。PostgreSQL 仅在比较两个行构造器的结果时(如第 9.25.5 节中所述)或将行构造器与子查询的输出进行比较时(如第 9.24 节中所述)执行此操作。在比较两个复合类型值的其他上下文中,两个 NULL 字段值被认为是相等的,并且 NULL 被认为大于非 NULL 值。为了使复合类型具有一致的排序和索引行为,这是必要的。
对每一侧进行求值,然后按行进行比较。当operator
为 =
、<>
、<
、<=
、>
或 >=
,或者具有与这些运算符相似的语义时,允许进行复合类型比较。(具体来说,如果一个运算符是 B 树运算符类的成员,或者是 B 树运算符类中 =
成员的否定符,则该运算符可以是行比较运算符。) 对于行构造器,上述运算符的默认行为与 IS [ NOT ] DISTINCT FROM
相同(请参见第 9.25.5 节)。
为了支持匹配包含没有默认 B 树运算符类的元素的行,定义了以下运算符用于复合类型比较:*=
、*<>
、*<
、*<=
、*>
和 *>=
。这些运算符比较两个行的内部二进制表示。即使使用相等运算符对两行进行比较的结果为 true,两行的二进制表示也可能不同。这些比较运算符下的行排序是确定性的,但没有其他意义。这些运算符在内部用于物化视图,并且可能对其他特殊用途(例如复制和 B 树去重)有用(请参见第 64.1.4.3 节)。尽管如此,它们并不打算普遍用于编写查询。
如果您发现文档中任何不正确的内容,与您使用特定功能的体验不符,或需要进一步澄清的内容,请使用此表格报告文档问题。