本文共 2783 字,大约阅读时间需要 9 分钟。
本节描述几个特殊的结构,用于在值的组之间进行多重比较。这些形式语法上和前面一节的子查询形式相关,但不涉及子查询。这类表达式主要用于PostgreSQL扩展的数组操作,其他数据库则支持SQL兼容的形式。所有记录的表达式形式都返回布尔(Boolean)结果(真/假)。
expression IN (value [, ...])
右侧是一个圆括弧包围的标量列表。如果左侧表达式的结果等于右侧任何一个表达式的值,结果为“真”。它是以下形式的缩写:
expression = value1 OR expression = value2 OR ...
IN结构的结果将为空值,而不是假。这符合SQL处理空值的布尔组合规则。expression NOT IN (value [, ...])
右侧是一个圆括弧包围的标量列表。如果左侧表达式的结果不等于右侧所有表达式的值,结果为“真”。它是以下形式的缩写:
expression > value1 AND expression > value2 AND ...
NOT IN结构的结果将为空值,而不是我们天真地认为的“假”。这符合SQL处理空值的布尔组合规则。提示
x NOT IN y在所有情况下都等效于NOT (x IN y)。但在处理空值时,NOT IN比IN更可能迷惑新手。最好尽可能使用正逻辑来表达你的条件。
expression operator ANY (array expression)expression operator SOME (array expression)
右侧是一个圆括弧包围的表达式,必须返回数组值。左侧表达式被计算并与数组中的每个元素进行比较,比较结果必须为布尔值。如果任何比较结果为“真”,则ANY/SOME结果为“真”;如果没有找到“真”结果(包括数组为空的情况),结果为“假”。
ANY/SOME结果为空值。ANY/SOME通常返回空值(尽管非严格比较操作符可能有不同结果)。ANY/SOME结果为空值而不是“假”(假设是严格比较操作符)。这符合SQL对空值的布尔组合规则。提示
SOME是ANY的同义词。
expression operator ALL (array expression)
右侧是一个圆括弧包围的表达式,必须返回数组值。左侧表达式被计算并与数组中的每个元素进行比较,比较结果必须为布尔值。如果所有比较结果都为“真”,则ALL结果为“真”(包括数组为空的情况);如果有任何结果为“假”,则结果为“假”。
ALL结果为空值。ALL通常返回空值(尽管非严格比较操作符可能有不同结果)。ALL结果为空值而不是“真”(再次,假设是严格比较操作符)。这符合SQL对空值的布尔组合规则。row_constructor operator row_constructor
每一边都是一个行构造器,如所述。两个行值必须具有相同数量的域。每一边被计算并逐行比较。当操作符是=、<>、<、<=、>、>=时,允许进行行构造器比较。每个行元素必须是具有默认B树操作符类的类型,否则比较将产生错误。
等式=和不等式<>:
小于、小于等于、大于、大于等于:
<、<=、>、>=操作符的处理与当前不同。例如,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_constructorrow_constructor IS NOT DISTINCT FROM row_constructor
IS DISTINCT FROM:
=行比较相似,但空值输入不会得到空值;IS NOT DISTINCT FROM:
=行比较相似,但空值输入不会得到空值;record operator record
SQL规范要求在结果依赖于比较两个NULL值或一个NULL与一个非NULL时逐行比较返回NULL。PostgreSQL仅在以下情况下这样做:
ROW)的结果;在其他比较两个组合类型值的环境中,两个NULL域值被认为相等,并且一个NULL被认为大于一个非NULL。为了得到组合类型的一致的排序和索引行为,这种处理是必要的。
PostgreSQL还定义了以下操作符用于比较包含无默认B树操作符类元素的行:
*=*<>*<*<=>**>=这些操作符比较两行的内部二进制表达,即使两行用=操作符比较为真,两行也可能具有不同的二进制表达。行在这些比较操作符之下的排序是决定性的,其他倒没什么意义。
这些操作符在内部用于物化视图,并可能对其他如复制之类的特殊功能有用,但它们并不打算用于书写查询等普通用途中。
本文转自PostgreSQL中文社区,原文链接:链接
转载地址:http://pnxfk.baihongyu.com/