9.2. 比较操作符

可用的比较操作符在Table 9-1显示。

Table 9-1. 比较操作符

操作符 描述
< 小于
> 大于
<= 小于或等于
>= 大于或等于
= 等于
<>!= 不等于

Note: !=操作符在分析器阶段被转换成<>!=<>操作符是完全等价的。

比较操作符可以用于所有相关的数据类型。所有比较操作符都是双目操作符, 返回boolean类型数值;像1 < 2 < 3 这样的表达式是非法的(因为布尔值和3之间不能做比较)。

除了比较操作符以外,我们还可以使用BETWEEN构造。

_a_ BETWEEN _x_ AND _y_

等效于

_a_ >= _x_ AND _a_ <= _y_

注意BETWEEN认为端点值是包含在范围内的。NOT BETWEEN 做相反的比较:

_a_ NOT BETWEEN _x_ AND _y_

等效于

_a_ < _x_ OR _a_ > _y_

BETWEEN SYMMETRICBETWEEN一样,只是没有要求 AND左边的参数小于或等于右边的参数。如果左面的参数不小于或等于右面的参数, 那么两个参数是自动交换的,所以非空范围总是适用。

要检查一个值是否为 NULL ,使用下面的构造:

_expression_ IS NULL
_expression_ IS NOT NULL

或者等效,但并不标准的构造:

_expression_ ISNULL
_expression_ NOTNULL

不要_expression_ = NULL 因为NULL是不"等于"NULL的。 NULL 代表一个未知的数值,因此我们无法知道两个未知的数值是否相等。这个行为遵循 SQL 标准。

Tip: 有些应用可能要求表达式_expression_ = NULL 在_expression_为 NULL 时候返回真。 我们强烈建议这样的应用修改成遵循 SQL 标准。但是,如果这样修改是不可能的, 那么我们可以打开transform_null_equals配置参数, 让PostgreSQL将x = NULL 自动转换成x IS NULL

Note: 如果_expression_是行值, 那么当行表达式本身为 NULL 或该行的所有字段都为 NULL 时,IS NULL将为真; 当行表达式本身不为 NULL 并且该行的所有字段都不为 NULL 时,IS NOT NULL 也将为真。因为这个行为,IS NULLIS NOT NULL 并不总是为行值表达式返回相反的值,也就是, 一个同时包含NULL和non-null值的行值表达式将在两种情况下都返回false。 这个规定符合 SQL 标准,但是与PostgreSQL之前的版本不兼容。

如果有任何一个输入是 NULL ,那么普通的比较操作符生成 NULL(表示"未知"), 而不是true或false。例如,7 = NULL生成null,7 &lt;&gt; NULL 也生成null。当这种行为不适用时,使用IS [ NOT ] DISTINCT FROM构造:

_expression_ IS DISTINCT FROM _expression_
_expression_ IS NOT DISTINCT FROM _expression_

对于非 NULL 的输入IS DISTINCT FROM&lt;&gt; 操作符相同。但是,如果两个输入都是 NULL ,那么它将返回假;如果只有一个输入是 NULL , 那么它将返回真。类似的,对于非 NULL 的输入IS NOT DISTINCT FROM=操作符相同。但是,如果两个输入都是 NULL ,那么它将返回真; 如果只有一个输入是 NULL ,那么它将返回假。这样就很有效地把 NULL 当作一个普通数据值看待, 而不是"未知"。

布尔数值可以用下面的构造进行测试

_expression_ IS TRUE
_expression_ IS NOT TRUE
_expression_ IS FALSE
_expression_ IS NOT FALSE
_expression_ IS UNKNOWN
_expression_ IS NOT UNKNOWN

这些构造将总是返回真或假,从来不返回 NULL ,即使操作数是 NULL 也如此。 NULL 输入被当做逻辑数值"未知"。请注意实际上IS UNKNOWNIS NOT UNKNOWN分别与IS NULLIS NOT NULL 相同,只是输入表达式必须是布尔类型。