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 SYMMETRIC
和BETWEEN
一样,只是没有要求 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 NULL
和IS NOT NULL
并不总是为行值表达式返回相反的值,也就是, 一个同时包含NULL和non-null值的行值表达式将在两种情况下都返回false。 这个规定符合 SQL 标准,但是与PostgreSQL之前的版本不兼容。
如果有任何一个输入是 NULL ,那么普通的比较操作符生成 NULL(表示"未知"), 而不是true或false。例如,7 = NULL
生成null,7 <> NULL
也生成null。当这种行为不适用时,使用IS [ NOT ] DISTINCT FROM
构造:
_expression_ IS DISTINCT FROM _expression_
_expression_ IS NOT DISTINCT FROM _expression_
对于非 NULL 的输入IS DISTINCT FROM
与<>
操作符相同。但是,如果两个输入都是 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 UNKNOWN
和IS NOT UNKNOWN
分别与IS NULL
和IS NOT NULL
相同,只是输入表达式必须是布尔类型。