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. 逐行比较

(expression [, expression ...]) operator (expression [, expression ...])

两遍都是一个标量列表;两个列表必须等长。两边都被计算并且逐行比较。 目前,只允许用 =<> 操作符进行 逐行比较。如果两行相等,结果是 "true",否则是假。

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