9.17. 行和数组比较

本节描述一个特殊的构造,用于在组和数值之间进行多重比较。这些形式语法上和前面一节的子查询形式相关,但是不涉及子查询。 这种形式涉及的 数组子表达式是 PostgreSQL 的扩展; 其它的是 SQL 兼容的。所有本节记录的表达式形式都返回布尔(Boolean)结果(真/假)。

9.17.1. IN

expression IN (value[, ...])

右手边是一个圆括弧包围的标量列表。如果左手边的表达式结果等于任何右手边表达式中的一个,结果为"真"。它是下面的方式的缩写

expression = value1
OR
expression = value2
OR
...

请注意如果左手边表达式生成空,或者没有相等的右手边数值并且至少有一个右手边的表达式生成空,那么 IN 构造的结果将为空, 而不是假。这是与 SQL 处理布尔和空值在一起的问题的时候的一般规则一致的。

9.17.2. NOT IN

expression NOT IN (value[, ...])

右手边是一个圆括弧包围的标量列表。如果左手边的表达式结果不等于所有右手边表达式的值,结果为"真"。它是下面的方式的缩写

expression <> value1
AND
expression <> value2
AND
...

请注意如果左手边表达式生成空,或者没有相等的右手边数值并且至少有一个右手边的表达式生成空,那么 NOT IN 构造的结果将为空, 而不是假。这是与 SQL 处理布尔和空值在一起的问题的时候的一般规则一致的。

提示: x NOT IN y 在所有场合都等效于 NOT (x IN y)。 但是,在处理空值的时候,用 NOT IN 比用 IN 更容易迷惑新手。 最好用正逻辑来表达你的条件。

9.17.3. ANY/SOME (数组)

expression operator ANY (array expression)
expression operator SOME (array expression)

右手边是一个圆括弧包围的表达式,它必须生成一个数组值。左手边表达式使用给出的操作符 operator,对数组的每个元素进行计算和比较,这个操作符必须生成布尔结果。 如果获取了任何真值结果,那么 ANY 的结果是 "true"。 如果没有找到真值结果(包括数组只有零元素的特例),那么结果是 "false"

SOMEANY 的同义词。

9.17.4. ALL (array)

expression operator ALL (array expression)

右手边是一个圆括弧包围的表达式,它必须生成一个数组值。左手边表达式使用给出的操作符 operator,对数组的每个元素进行计算和比较,这个操作符必须 生成布尔结果。如果所有比较都生成真值结果,那么 ALL 的结果是 "true"(包括数组只有零元素的特例)。 如果有任何假值结果,那么结果是 "false"

9.17.5. 逐行比较

row_constructor operator row_constructor

两遍都是一个行构造器;如 Section 4.2.11 里所述。 两个行必须有同等数目的字段。两边都被计算并且逐行比较。 目前,只允许用 =<> 操作符进行 逐行比较。如果两行相等,结果是 "true",否则是假。

通常,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则进行组合的。 如果两个行对应的成员都是非空并且相等,那么认为这两行相等; 如果任意对应成员为非空且不等,那么该两行不等; 否则这样的行比较的结果是未知(NULL)。

row_constructor IS DISTINCT FROM row_constructor

这些构造类似一个 <> 行比较, 但是它对空值输入不生成空。而是任何空值都认为是不等于(区别于)任何非空值, 并且任何两个空都认为是相等的(没有区别)。因此,这个的结果将不是真就是假,绝不会是空。

row_constructor IS NULL
row_constructor IS NOT NULL

这个构造测试一行的数值时空还是非空。一个行值只有在至少有一个字段不为空的时候,才是非空。