行和数组比较
From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community
目录 |
[编辑] 行和数组比较
本节描述一个特殊的构造,用于在组和数值之间进行多重比较。这些形式语法上和前面一节的子查询形式相关,但是不涉及子查询。 这种形式涉及的 数组子表达式是 PostgreSQL 的扩展; 其它的是 SQL 兼容的。所有本节记录的表达式形式都返回布尔(Boolean)结果(真/假)。
[编辑] IN
expression IN (value[, ...])
右手边是一个圆括弧包围的标量列表。如果左手边的表达式结果等于任何右手边表达式中的一个,结果为"真"。它是下面的方式的缩写
expression = value1 OR expression = value2 OR ...
请注意如果左手边表达式生成空,或者没有相等的右手边数值并且至少有一个右手边的表达式生成空,那么 IN 构造的结果将为空, 而不是假。这是与 SQL 处理布尔和空值在一起的问题的时候的一般规则一致的。
[编辑] 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 更容易迷惑新手。 最好用正逻辑来表达你的条件。
[编辑] ANY/SOME (数组)
expression operator ANY (array expression) expression operator SOME (array expression)
右手边是一个圆括弧包围的表达式,它必须生成一个数组值。左手边表达式使用给出的操作符 operator,对数组的每个元素进行计算和比较,这个操作符必须生成布尔结果。 如果获取了任何真值结果,那么 ANY 的结果是 "true"。 如果没有找到真值结果(包括数组只有零元素的特例),那么结果是 "false"。
SOME 是 ANY 的同义词。
[编辑] ALL (array)
expression operator ALL (array expression)
右手边是一个圆括弧包围的表达式,它必须生成一个数组值。左手边表达式使用给出的操作符 operator,对数组的每个元素进行计算和比较,这个操作符必须 生成布尔结果。如果所有比较都生成真值结果,那么 ALL 的结果是 "true"(包括数组只有零元素的特例)。 如果有任何假值结果,那么结果是 "false"。
[编辑] 逐行比较
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
这个构造测试一行的数值时空还是非空。一个行值只有在至少有一个字段不为空的时候,才是非空。
