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 |
为真或者为假 |
a
BETWEENx
ANDy
复制
等效于
a
>=x
ANDa
<=y
复制
注意BETWEEN
认为终点值是包含在范围内的。 NOT
BETWEEN
可以做相反比较:
a
NOT BETWEENx
ANDy
复制
等效于
a
<x
ORa
>y
复制
BETWEEN
SYMMETRIC
和BETWEEN
相似,不过BETWEEN SYMMETRIC
不要求AND
左边的参数小于或等于右边的参数。如果左参数不是小于等于右参数,这两个参数会自动被交换,这样总是会应用一个非空范围。
当有一个输入为空时,普通的比较操作符会得到空(表示”),而不是真或假。例如,7 =
NULL
得到空,7 <> NULL
也一样。如果这种行为不合适,可以使用IS [] DISTINCT FROM
谓词:
a
IS DISTINCT FROMb
a
IS NOT DISTINCT FROMb
复制
对于非空输入,IS DISTINCT FROM
和<>
操作符一样。不过,如果两个输入都为空,它会返回假。而如果只有一个输入为空,它会返回真。类似地,IS NOT DISTINCT FROM
对于非空输入的行为与=
相同,但是当两个输入都为空时它返回真,并且当只有一个输入为空时返回假。因此,这些谓词实际上把空值当作一种普通数据值而不是”。
expression
IS NULLexpression
IS NOT NULL复制
或者等效,但并不标准的谓词:
expression
ISNULLexpression
NOTNULL复制
写
,因为expression
= NULLNULL
是不”NULL
的(控制代表一个未知的值,因此我们无法知道两个未知的数值是否相等)。
提示
有些应用可能要求表达式
在expression
= NULLexpression
得出空值时返回真。我们强烈建议这样的应用修改成遵循 SQL
标准。但是,如果这样修改不可能完成,那么我们可以使用配置变量transform_null_equals。如果打开它,将把x =
NULL
子句转换成x IS NULL
。
如果expression
是行值,那么当行表达式本身为非空值或者行的所有域为非空时IS NULL
为真。由于这种行为,IS NULL
和IS NOT NULL
并不总是为行值表达式返回反转的结果,特别是,一个同时包含 NULL
和非空值的域将会对两种测试都返回假。在某些情况下,写成row
IS DISTINCT FROM NULL
或者row
IS NOT DISTINCT FROM
NULL
会更好,它们只会检查整个行值是否为空而不需要在行的域上做额外的测试。
boolean_expression
IS TRUEboolean_expression
IS NOT TRUEboolean_expression
IS FALSEboolean_expression
IS NOT FALSEboolean_expression
IS UNKNOWNboolean_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 |