9.2. 比较函数和运算符

常用的比较运算符可用,如Table 9.1所示。

表 9.1. 比较运算符

OperatorDescription
<less than
>greater than
<=小于或等于
>=大于或等于
=equal
<>!=not equal

Note

!=运算符在解析器阶段转换为<>。无法实现执行不同功能的!=<>运算符。

比较运算符可用于所有相关数据类型。所有比较运算符都是二进制运算符,它们返回boolean类型的值;诸如1 < 2 < 3之类的表达式无效(因为没有<运算符可将布尔值与3进行比较)。

还有一些比较谓词,如Table 9.2所示。它们的行为很像运算符,但是具有 SQL 标准规定的特殊语法。

表 9.2. 比较谓词

PredicateDescription
a BETWEEN x AND ybetween
a NOT BETWEEN x AND ynot between
a BETWEEN SYMMETRIC x AND y在对比较值进行排序之后
a NOT BETWEEN SYMMETRIC x AND y在对比较值进行排序之后,不在两者之间
a IS DISTINCT FROM b不相等,将 null 视为普通值
a IS NOT DISTINCT FROM b相等,将 null 视为普通值
expression IS NULLis null
expression IS NOT NULL不为空
expression ISNULL为 null(非标准语法)
expression NOTNULL不为空(非标准语法)
boolean_expression IS TRUEis true
boolean_expression IS NOT TRUE错误或未知
boolean_expression IS FALSEis false
boolean_expression IS NOT FALSE是真实的还是未知的
boolean_expression IS UNKNOWNis 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,但不要求AND左侧的参数小于或等于右侧的参数。如果不是,则会自动交换这两个参数,以便始终隐含一个非空范围。

当任一 Importing 为 null 时,普通比较运算符将生成 null(表示“未知”),而不是 true 或 false。例如,7 = NULL7 <> NULL一样产生 null。如果此行为不合适,请使用IS [ NOT ] DISTINCT FROM谓词:

a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b

对于非空 Importing,IS DISTINCT FROM<>运算符相同。但是,如果两个 Importing 均为 null,则返回 false,如果只有一个 Importing 为 null,则返回 true。类似地,对于非空 Importing,IS NOT DISTINCT FROM=相同,但是当两个 Importing 均为空时,它返回 true;而当只有一个 Importing 为空时,它返回 false。因此,这些谓词有效地表现为空值是正常数据值,而不是“未知”。

要检查值是否为空,请使用谓词:

expression IS NULL
expression IS NOT NULL

或等同但非标准的谓词:

expression ISNULL
expression NOTNULL

不要expression = NULL,因为NULL不等于NULL。 (空值表示一个未知值,并且未知两个未知值是否相等.)

Tip

如果* expression *计算为空值,某些应用程序可能期望expression = NULL返回 true。强烈建议修改这些应用程序以符合 SQL 标准。但是,如果无法做到这一点,则transform_null_equals配置变量可用。如果启用,PostgreSQL 会将x = NULL子句转换为x IS NULL

如果* expression 为行值,则当行表达式本身为 null 或所有行的字段为 null 时,IS NULL为 true,而当行表达式本身为非 null 且所有行的字段均为 non 时,IS NOT NULL为 true -空值。由于这种行为,IS NULLIS NOT NULL并不总是返回行值表达式的反结果。特别是,同时包含 null 和 non-null 字段的行值表达式对于两个测试都将返回 false。在某些情况下,最好写入 row * IS DISTINCT FROM NULL或* row * IS NOT DISTINCT FROM 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

这些将始终返回 true 或 false,即使操作数为 null,也永远不会返回 null 值。空 Importing 被视为逻辑值“未知”。请注意,IS UNKNOWNIS NOT UNKNOWN实际上分别与IS NULLIS NOT NULL相同,除了 Importing 表达式必须为布尔类型。

还提供一些与比较相关的功能,如Table 9.3所示。

表 9.3. 比较功能

FunctionDescriptionExampleExample Result
num_nonnulls(VARIADIC "any")返回非空参数的数量num_nonnulls(1, NULL, 2)2
num_nulls(VARIADIC "any")返回空参数的数量num_nulls(1, NULL, 2)1