9.2. 比较操作符

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

Table 9-1. 比较操作符

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

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

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

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

aBETWEENxANDy

等效于

a>=xANDa<=y

请注意BETWEEN处理范围包含端点的值。 NOT BETWEEN做相反的比较:

aNOT BETWEENxANDy

类似的还有

a<xORa>y

这两种形式之间没有什么区别,只不过第一种形式需要一些CPU周期在内部将它改写成第二种形式。 BETWEEN SYMMETRICBETWEEN一样,只是没有要求AND左边的参数小于或等于右边的参数;

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

expressionIS NULL
expressionIS NOT NULL

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

expressionISNULL
expressionNOTNULL

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

Tip: 有些应用可能要求表达式expression= NULLexpression为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值的行值表达式对二者都会返回假。 这个规定符合SQL标准,但是与8.2之前的版本不兼容。

如果有任何一个输入是NULL,那么普通的比较操作符生成NULL(表示"未知")。 例如,7 = NULL生成NULL。当这种方式不合适时, 可以用IS[NOT]DISTINCT FROM构造

expressionIS DISTINCT FROMexpression
expressionIS NOT DISTINCT FROMexpression

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

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

expressionIS TRUE
expressionIS NOT TRUE
expressionIS FALSE
expressionIS NOT FALSE
expressionIS UNKNOWN
expressionIS NOT UNKNOWN

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