本节介绍了SQL- 兼容子查询表达式,可在 PostgreSQL 中使用。本节中记录的所有表达式形式都返回布尔值(真/假)结果。
EXISTS
#EXISTS (subquery
)
EXISTS
的参数是一个任意的 SELECT
语句,或 子查询。子查询将被评估,以确定它是否返回任何行。如果它返回至少一行,则 EXISTS
的结果为 “true”;如果子查询不返回任何行,则 EXISTS
的结果为 “false”。
子查询可以引用周围查询中的变量,这些变量在子查询的任何一次评估中都将充当常量。
子查询通常只执行足够长的时间来确定是否返回了至少一行,而不是完全执行。编写具有副作用的子查询(例如调用序列函数)是不明智的;副作用是否发生可能是不可预测的。
由于结果仅取决于是否返回了任何行,而不取决于这些行的内容,因此子查询的输出列表通常不重要。常见的编码约定是将所有 EXISTS
测试编写为 EXISTS(SELECT 1 WHERE ...)
的形式。但是,此规则有一些例外,例如使用 INTERSECT
的子查询。
这个简单的例子类似于 col2
上的内连接,但它最多为每个 tab1
行生成一行输出,即使有几行匹配的 tab2
行
SELECT col1 FROM tab1 WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
IN
#expression
IN (subquery
)
右侧是一个带括号的子查询,它必须返回正好一列。左侧表达式将被评估,并与子查询结果的每一行进行比较。如果找到任何相等的子查询行,则 IN
的结果为 “true”。如果未找到任何相等的行(包括子查询不返回任何行的情况),则结果为 “false”。
请注意,如果左侧表达式产生空值,或者没有相等的右侧值,并且至少一个右侧行产生空值,则 IN
构造的结果将为空,而不是假。这符合 SQL 对空值布尔组合的正常规则。
与 EXISTS
一样,假设子查询将被完全评估是不明智的。
row_constructor
IN (subquery
)
这种形式的 IN
的左侧是一个行构造函数,如 第 4.2.13 节 中所述。右侧是一个带括号的子查询,它必须返回与左侧行中表达式数量相同的列。左侧表达式将被评估,并与子查询结果的每一行进行逐行比较。如果找到任何相等的子查询行,则 IN
的结果为 “true”。如果未找到任何相等的行(包括子查询不返回任何行的情况),则结果为 “false”。
与往常一样,行中的空值将根据 SQL 布尔表达式的正常规则进行组合。如果所有对应成员均非空且相等,则两行被视为相等;如果任何对应成员均非空且不相等,则两行被视为不相等;否则,该行比较的结果未知(为空)。如果所有每行结果都是不相等或为空,并且至少有一个为空,则 IN
的结果为空。
NOT IN
#expression
NOT IN (subquery
)
右侧是一个带括号的子查询,它必须返回正好一列。左侧表达式将被评估,并与子查询结果的每一行进行比较。如果仅找到不相等的子查询行(包括子查询不返回任何行的情况),则 NOT IN
的结果为 “true”。如果找到任何相等的行,则结果为 “false”。
请注意,如果左侧表达式产生空值,或者没有相等的右侧值,并且至少一个右侧行产生空值,则 NOT IN
构造的结果将为空,而不是真。这符合 SQL 对空值布尔组合的正常规则。
与 EXISTS
一样,假设子查询将被完全评估是不明智的。
row_constructor
NOT IN (subquery
)
这种形式的 NOT IN
的左侧是一个行构造函数,如 第 4.2.13 节 中所述。右侧是一个带括号的子查询,它必须返回与左侧行中表达式数量相同的列。左侧表达式将被评估,并与子查询结果的每一行进行逐行比较。如果仅找到不相等的子查询行(包括子查询不返回任何行的情况),则 NOT IN
的结果为 “true”。如果找到任何相等的行,则结果为 “false”。
与往常一样,行中的空值将根据 SQL 布尔表达式的正常规则进行组合。如果所有对应成员均非空且相等,则两行被视为相等;如果任何对应成员均非空且不相等,则两行被视为不相等;否则,该行比较的结果未知(为空)。如果所有每行结果都是不相等或为空,并且至少有一个为空,则 NOT IN
的结果为空。
ANY
/SOME
#expression
operator
ANY (subquery
)expression
operator
SOME (subquery
)
右侧是一个带括号的子查询,它必须返回正好一列。左侧表达式将被评估,并与子查询结果的每一行使用给定的 operator
进行比较,该操作符必须产生布尔值结果。如果获得任何真结果,则 ANY
的结果为 “true”。如果未找到任何真结果(包括子查询不返回任何行的情况),则结果为 “false”。
SOME
是 ANY
的同义词。 IN
等效于 = ANY
。
请注意,如果没有任何成功,并且至少一个右侧行对运算符的结果产生空值,则 ANY
构造的结果将为空,而不是假。这符合 SQL 对空值布尔组合的正常规则。
与 EXISTS
一样,假设子查询将被完全评估是不明智的。
row_constructor
operator
ANY (subquery
)row_constructor
operator
SOME (subquery
)
这种形式的 ANY
的左侧是一个行构造函数,如 第 4.2.13 节 中所述。右侧是一个带括号的子查询,它必须返回与左侧行中表达式数量相同的列。左侧表达式将被评估,并与子查询结果的每一行使用给定的 operator
进行逐行比较。如果比较对任何子查询行返回真,则 ANY
的结果为 “true”。如果比较对每个子查询行都返回假(包括子查询不返回任何行的情况),则结果为 “false”。如果与子查询行的比较都没有返回真,并且至少有一个比较返回 NULL,则结果为 NULL。
有关行构造函数比较含义的详细信息,请参阅 第 9.25.5 节。
ALL
#expression
operator
ALL (subquery
)
右侧是一个带括号的子查询,它必须返回正好一列。左侧表达式将被评估,并与子查询结果的每一行使用给定的 operator
进行比较,该操作符必须产生布尔值结果。如果所有行都产生真(包括子查询不返回任何行的情况),则 ALL
的结果为 “true”。如果找到任何假结果,则结果为 “false”。如果与子查询行的比较都没有返回假,并且至少有一个比较返回 NULL,则结果为 NULL。
NOT IN
等效于 <> ALL
。
与 EXISTS
一样,假设子查询将被完全评估是不明智的。
row_constructor
operator
ALL (subquery
)
此形式的 ALL
的左侧是一个行构造器,如第 4.2.13 节所述。右侧是一个带括号的子查询,它必须返回与左侧行中表达式数量完全相同的列。左侧表达式将使用给定的运算符
逐行评估并与子查询结果的每一行进行比较。如果比较对所有子查询行(包括子查询返回 0 行的情况)都返回 true,则 ALL
的结果为“true”。如果比较对任何子查询行都返回 false,则结果为“false”。如果没有任何与子查询行的比较返回 false,并且至少有一个比较返回 NULL,则结果为 NULL。
有关行构造函数比较含义的详细信息,请参阅 第 9.25.5 节。
row_constructor
operator
(subquery
)
左侧是一个行构造器,如第 4.2.13 节所述。右侧是一个带括号的子查询,它必须返回与左侧行中表达式数量完全相同的列。此外,子查询不能返回超过一行。(如果它返回 0 行,则结果被认为是 null。)左侧将逐行评估并与单个子查询结果行进行比较。
有关行构造函数比较含义的详细信息,请参阅 第 9.25.5 节。
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表格报告文档问题。