可用的比较操作符在表9-1显示。
【注意】 != 操作符在分析器阶段被转换成 <> 。!= 和 <> 操作符是完全等价的。
比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,返回 boolean 类型数值;像 1 < 2 < 3 这样的表达式是非法的(因为布尔值和 3 之间不能做比较)。
a BETWEEN x 和 y
等效于
a >= x 和 a <= y
类似的还有
a NOT BETWEEN x 和 y
等效于
a < x OR a > y
这两种形式之间没有什么区别,只不过第一种形式需要一些CPU周期在内部将它改写成第二种形式。BETWEEN SYMMETRIC 和 BETWEEN 一样,只是没有要求 AND 左边的参数小于或等于右边的参数;合适的范围是自动计算出来的。
expression IS NULL expression IS NOT NULL
或者等效,但并不标准的构造
expression ISNULL expression NOTNULL
不要写 expression = NULL 因为 NULL 是不"等于" NULL 的。NULL 代表一个未知的数值,因此我们无法知道两个未知的数值是否相等。这个行为遵循 SQL 标准。
【提示】有些应用可能要求表达式 expression = NULL 在 expression 为 NULL 时候返回真。我们强烈建议这样的应用修改成遵循 SQL 标准。但是,如果这样修改是不可能的,那么我们可以打开 transform_null_equals 配置参数,让 PostgreSQL 将 x = NULL 自动转换成 x IS NULL 。在 PostgreSQL 版本 6.5 到7.1之间,这是缺省的行为。
【注意】]如果 expression 是行值,那么当行表达式本身为 NULL 或该行的所有字段都为 NULL 时,IS NULL 将为真;当行表达式本身不为 NULL 并且该行的所有字段都不为 NULL 时,IS NOT NULL 也将为真。这个规定符合 SQL 标准,但是与 8.2 之前的版本不兼容。
如果有任何一个输入是 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 相同,只是输入表达式必须是布尔类型。