9.2. 比较操作符
常见的比较操作符都可用,如表 9-1所示。
表 9-1. 比较操作符
操作符 | 描述 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
= | 等于 |
<> or != | 不等于 |
注意: !=操作符在分析器阶段被转换成<>。不能把!=和<>操作符实现为做不同的事。
比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,它们返回boolean类型;类似于1 < 2 < 3的表达式是非法的(因为没有<操作符可以比较一个布尔值和3)。
如表 9-2所示,也有一些比较谓词。 它们的行为和操作符很像,但是具有 SQL 标准所要求的特殊语法。
表 9-2. 比较谓词
谓词 | 描述 |
---|---|
a BETWEEN x AND y | 在x和y之间 |
a NOT BETWEEN x AND y | 不在x和y之间 |
a BETWEEN SYMMETRIC x AND y | 在对比较值排序后位于x和y之间 |
a NOT BETWEEN SYMMETRIC x AND y | 在对比较值排序后不位于x和y之间 |
a IS DISTINCT FROM b | 不等于,空值被当做一个普通值 |
a IS NOT DISTINCT FROM b | 等于,空值被当做一个普通值 |
expression IS NULL | 是空值 |
expression IS NOT NULL | 不是空值 |
expression ISNULL | 是空值(非标准语法) |
expression NOTNULL | 不是空值(非标准语法) |
boolean_expression IS TRUE | 为真 |
boolean_expression IS NOT TRUE | 为假或未知 |
boolean_expression IS FALSE | 为假 |
boolean_expression IS NOT FALSE | 为真或者未知 |
boolean_expression IS UNKNOWN | 值为未知 |
boolean_expression IS NOT UNKNOWN | 为真或者为假 |
除了比较操作符以外,特殊的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相同,不过BETWEEN SYMMETRIC不要求AND左边的参数小于或等于右边的参数。如果左参数不是小于等于右参数,这两个参数会自动被交换,这样总是会应用一个非空范围。
当有一个输入为空时,普通的比较操作符会得到空(表示"未知"), 而不是真或假。例如,7 = NULL得到空,7 <> NULL 也一样。如果这种行为不合适,可以使用 IS [ NOT ] DISTINCT FROM谓词:
a IS DISTINCT FROM b a IS NOT DISTINCT FROM b
对于非空输入,IS DISTINCT FROM和<> 操作符一样。不过,如果两个输入都为空,它会返回假。而如果只有一个输入为空, 它会返回真。类似地,IS NOT DISTINCT FROM 对于非空输入的行为与=相同,但是当两个输入都为空时它返回真, 并且当只有一个输入为空时返回假。因此, 这些谓词实际上把空值当作一种普通数据值而不是"unknown"。
要检查一个值是否为空,使用下面的结构:
expression IS NULL expression IS NOT NULL
或者等效,但并不标准的结构:
expression ISNULL expression NOTNULL
不要写expression = NULL,因为NULL是不"等于"NULL的(控制代表一个未知的值,因此我们无法知道两个未知的数值是否相等)。这种行为符合 SQL 标准。
提示: 有些应用可能要求表达式expression = NULL在expression得出空值时返回真。我们强烈建议这样的应用修改成遵循 SQL 标准。但是,如果这样修改不可能完成,那么我们可以使用配置变量transform_null_equals。如果打开它,PostgreSQL将把x = NULL子句转换成x IS NULL。
布尔值也可以使用下列结构进行测试:
boolean_expression IS TRUE boolean_expression IS NOT TRUE boolean_expression IS FALSE boolean_expression IS NOT FALSE boolean_expression IS UNKNOWN boolean_expression IS NOT UNKNOWN
这些结构将总是返回真或假,从来不返回空值,即使操作数是空也如此。空值输入被当做逻辑值"未知"。 请注意实际上IS UNKNOWN和IS NOT UNKNOWN分别与IS NULL和IS NOT NULL相同, 只是输入表达式必须是布尔类型。
如表 9-3中所示, 也有一些比较相关的函数可用。
表 9-3. 比较函数
函数 | 描述 | 示例 | 示例结果 |
---|---|---|---|
num_nonnulls(VARIADIC "any") | 返回非空参数的数量 | num_nonnulls(1, NULL, 2) | 2 |
num_nulls(VARIADIC "any") | 返回空参数的数量 | num_nulls(1, NULL, 2) | 1 |