本节介绍 PostgreSQL 中可用的符合 SQL 标准的子查询表达式。本节中记录的所有表达式形式都返回布尔值(真/假)。SQL-compliant subquery expressions available in PostgreSQL. All of the expression forms documented in this section return Boolean (true/false) results.
EXISTS
#EXISTS (subquery
)
EXISTS
的参数是任意 SELECT
语句,或者称为子查询。子查询将被计算以确定它是否返回任何行。如果它至少返回一行,则 EXISTS
的结果为“true”;如果子查询不返回任何行,则 EXISTS
的结果为“false”。
子查询可以引用外部查询中的变量,这些变量在子查询的任何一次计算中都将充当常量。
子查询通常只执行到足以确定是否至少返回一行,而不是完全执行完毕。编写具有副作用(例如调用序列函数)的子查询是不明智的;副作用是否发生可能无法预测。
由于结果仅取决于是否返回任何行,而与这些行的内容无关,因此子查询的输出列表通常不重要。常见的编码约定是将所有 EXISTS
测试写成 EXISTS(SELECT 1 WHERE ...)
的形式。但是,此规则也有例外,例如使用 INTERSECT
的子查询。
这个简单的示例类似于在 col2
上进行内连接,但即使 tab2
有多行匹配,它也会为每行 tab1
生成最多一行输出。
SELECT col1 FROM tab1 WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
IN
#expression
IN (subquery
)
右侧是一个带括号的子查询,它必须返回一个且仅一个列。左侧表达式将被计算并与子查询结果的每一行进行比较。如果找到任何相等的子查询行,则 IN
的结果为“true”。如果没有找到相等的行(包括子查询不返回任何行的情况),则结果为“false”。
请注意,如果左侧表达式产生 null,或者没有相等的右侧值且至少有一个右侧行产生 null,则 IN
构造的结果将是 null,而不是 false。这符合 SQL 关于 null 值布尔组合的常规规则。
与 EXISTS
一样,假定子查询会完全评估是不明智的。
row_constructor
IN (subquery
)
此形式的 IN
的左侧是行构造函数,如 第 4.2.13 节中所述。右侧是一个带括号的子查询,它必须返回的列数与左侧行中的表达式数相同。左侧表达式将被计算并逐行与子查询结果的每一行进行比较。如果找到任何相等的子查询行,则 IN
的结果为“true”。如果没有找到相等的行(包括子查询不返回任何行的情况),则结果为“false”。
一如既往,行中的 null 值按照 SQL 布尔表达式的常规规则组合。两行被认为相等,如果它们的所有对应成员都非 null 且相等;如果任何对应成员非 null 且不相等,则这些行不相等;否则,该行比较的结果未知(null)。如果所有逐行结果都是不相等或 null,且至少有一个 null,则 IN
的结果为 null。
NOT IN
#expression
NOT IN (subquery
)
右侧是一个带括号的子查询,它必须返回一个且仅一个列。左侧表达式将被计算并与子查询结果的每一行进行比较。如果仅找到不相等的子查询行(包括子查询不返回任何行的情况),则 NOT IN
的结果为“true”。如果找到任何相等的行,则结果为“false”。
请注意,如果左侧表达式产生 null,或者没有相等的右侧值且至少有一个右侧行产生 null,则 NOT IN
构造的结果将是 null,而不是 true。这符合 SQL 关于 null 值布尔组合的常规规则。
与 EXISTS
一样,假定子查询会完全评估是不明智的。
row_constructor
NOT IN (subquery
)
此形式的 NOT IN
的左侧是行构造函数,如 第 4.2.13 节中所述。右侧是一个带括号的子查询,它必须返回的列数与左侧行中的表达式数相同。左侧表达式将被计算并逐行与子查询结果的每一行进行比较。如果仅找到不相等的子查询行(包括子查询不返回任何行的情况),则 NOT IN
的结果为“true”。如果找到任何相等的行,则结果为“false”。
一如既往,行中的 null 值按照 SQL 布尔表达式的常规规则组合。两行被认为相等,如果它们的所有对应成员都非 null 且相等;如果任何对应成员非 null 且不相等,则这些行不相等;否则,该行比较的结果未知(null)。如果所有逐行结果都是不相等或 null,且至少有一个 null,则 NOT IN
的结果为 null。
ANY
/SOME
#expression
operator
ANY (subquery
)expression
operator
SOME (subquery
)
右侧是一个带括号的子查询,它必须返回一个且仅一个列。左侧表达式将被计算并使用给定的运算符
与子查询结果的每一行进行比较,该运算符
必须产生布尔结果。如果获得任何真结果,则 ANY
的结果为“true”。如果没有找到真结果(包括子查询不返回任何行的情况),则结果为“false”。
SOME
是 ANY
的同义词。IN
等同于 = ANY
。
请注意,如果没有成功,并且至少有一行右侧的值对该运算符的结果为 null,则 ANY
构造的结果将是 null,而不是 false。这符合 SQL 关于 null 值布尔组合的常规规则。
与 EXISTS
一样,假定子查询会完全评估是不明智的。
row_constructor
operator
ANY (subquery
)row_constructor
operator
SOME (subquery
)
此形式的 ANY
的左侧是行构造函数,如 第 4.2.13 节中所述。右侧是一个带括号的子查询,它必须返回的列数与左侧行中的表达式数相同。左侧表达式将被计算并逐行与子查询结果的每一行进行比较,使用给定的运算符
。如果比较对于任何子查询行返回 true,则 ANY
的结果为“true”。如果比较对于每个子查询行都返回 false(包括子查询不返回任何行的情况),则结果为“false”。如果没有任何与子查询行的比较返回 true,并且至少有一个比较返回 NULL,则结果为 NULL。
有关行构造函数比较含义的详细信息,请参阅 第 9.25.5 节。
ALL
#expression
operator
ALL (subquery
)
右侧是一个带括号的子查询,它必须返回一个且仅一个列。左侧表达式将被计算并使用给定的运算符
与子查询结果的每一行进行比较,该运算符
必须产生布尔结果。如果所有行都返回 true(包括子查询不返回任何行的情况),则 ALL
的结果为“true”。如果找到任何 false 结果,则结果为“false”。如果没有任何与子查询行的比较返回 false,并且至少有一个比较返回 NULL,则结果为 NULL。
NOT IN
等同于 <> ALL
。
与 EXISTS
一样,假定子查询会完全评估是不明智的。
row_constructor
operator
ALL (subquery
)
此形式的 ALL
的左侧是行构造函数,如 第 4.2.13 节中所述。右侧是一个带括号的子查询,它必须返回的列数与左侧行中的表达式数相同。左侧表达式将被计算并逐行与子查询结果的每一行进行比较,使用给定的运算符
。如果比较对于所有子查询行都返回 true(包括子查询不返回任何行的情况),则 ALL
的结果为“true”。如果比较对于任何子查询行都返回 false,则结果为“false”。如果没有任何与子查询行的比较返回 false,并且至少有一个比较返回 NULL,则结果为 NULL。
有关行构造函数比较含义的详细信息,请参阅 第 9.25.5 节。
row_constructor
operator
(subquery
)
左侧是行构造函数,如 第 4.2.13 节中所述。右侧是一个带括号的子查询,它必须返回的列数与左侧行中的表达式数相同。此外,子查询不能返回多于一行。(如果它返回零行,则结果被视为 null。)左侧表达式将被计算并逐行与唯一的子查询结果行进行比较。
有关行构造函数比较含义的详细信息,请参阅 第 9.25.5 节。
如果您在文档中发现任何不正确之处、与您实际使用该功能时遇到的情况不符,或者需要进一步澄清之处,请使用 此表单 报告文档问题。