Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

9.2. 比较函数和运算符 #

可以使用通常的比较运算符,如 表 9.1 中所示。

表 9.1。比较运算符

运算符 说明
数据类型 < 数据类型布尔值 小于
数据类型 > 数据类型布尔值 大于
数据类型 <= 数据类型布尔值 小于或等于
数据类型 >= 数据类型布尔值 大于或等于
数据类型 = 数据类型布尔值 等于
数据类型 <> 数据类型布尔值 不等于
数据类型 != 数据类型布尔值 不等于

注意

<> 是“不等于”的标准 SQL 表示法。!= 是别名,在解析的非常早的阶段转换为 <>。因此,不可能实现功能不同的 !=<> 运算符。

对于所有具有自然顺序的内置数据类型,都可使用这些比较运算符,包括数值、字符串和日期/时间类型。此外,如果其组件数据类型可比较,则可以比较数组、复合类型和范围。

通常还可以比较相关数据类型的值;例如 integer > bigint 会起作用。某些这类情况由“跨类型”比较运算符直接实现,但如果不存在此类运算符,解析器会将较不通用类型强制转换为较通用类型并应用后者的比较运算符。

如上所示,所有比较运算符都是返回 boolean 类型值的二元运算符。因此,诸如 1 < 2 < 3 的表达式是无效的(因为没有 < 运算符可以将布尔值与 3 比较)。使用下面所示的 BETWEEN 谓词来执行范围测试。

还有一些比较谓词,如在 表 9.2 中所示。它们的行为与运算符非常相似,但具有 SQL 标准要求的特殊语法。

表 9.2. 比较谓词

谓词

说明

示例

数据类型 BETWEEN 数据类型 AND 数据类型布尔值

在之间(包括范围端点)。

2 BETWEEN 1 AND 3t

2 BETWEEN 3 AND 1f

datatype NOT BETWEEN datatype AND datatypeboolean

不介于(否定 BETWEEN)。

2 NOT BETWEEN 1 AND 3f

datatype BETWEEN SYMMETRIC datatype AND datatypeboolean

介于,在对两个端点值进行排序后。

2 BETWEEN SYMMETRIC 3 AND 1t

datatype NOT BETWEEN SYMMETRIC datatype AND datatypeboolean

不介于,在对两个值进行排序后。

2 NOT BETWEEN SYMMETRIC 3 AND 1f

datatype IS DISTINCT FROM datatypeboolean

不等于,将空值视为可比值。

1 IS DISTINCT FROM NULLt(而不是 NULL

NULL IS DISTINCT FROM NULLf(而不是 NULL

datatype IS NOT DISTINCT FROM datatypeboolean

等于,将空值视为可比值。

1 IS NOT DISTINCT FROM NULLf(而不是 NULL

NULL IS NOT DISTINCT FROM NULLt(而不是 NULL

datatype IS NULLboolean

测试值是否为空。

1.5 IS NULLf

datatype IS NOT NULLboolean

测试值是否非空。

'null' IS NOT NULLt

datatype ISNULLboolean

测试值是否为 null(非标准语法)。

数据类型 NOTNULLboolean

测试值是否不为 null(非标准语法)。

boolean IS TRUEboolean

测试布尔表达式是否返回 true。

true IS TRUEt

NULL::boolean IS TRUEf(而不是 NULL

boolean IS NOT TRUEboolean

测试布尔表达式是否返回 false 或 unknown。

true IS NOT TRUEf

NULL::boolean IS NOT TRUEt(而不是 NULL

boolean IS FALSEboolean

测试布尔表达式是否返回 false。

true IS FALSEf

NULL::boolean IS FALSEf(而不是 NULL

boolean IS NOT FALSEboolean

测试布尔表达式是否返回 true 或 unknown。

true IS NOT FALSEt

NULL::boolean IS NOT FALSEt(而不是 NULL

boolean IS UNKNOWNboolean

测试布尔表达式是否返回 unknown。

true IS UNKNOWNf

NULL::boolean IS UNKNOWNt(而不是 NULL

boolean IS NOT UNKNOWNboolean

测试布尔表达式是否返回 true 或 false。

true IS NOT UNKNOWNt

NULL::boolean IS NOT UNKNOWNf(而不是 NULL


BETWEEN 谓词简化了范围测试

a BETWEEN x AND y

等效于

a >= x AND a <= y

请注意, BETWEEN 将端点值视为范围中包括的值。 BETWEEN SYMMETRIC 类似于 BETWEEN,但没有要求 AND 左侧的参数小于或等于右侧的参数。如果不是,将自动交换这两个参数,以便始终暗示非空范围。

BETWEEN 的各个变体是根据普通比较运算符实现的,因此将适用于可以比较的任何数据类型。

注意

BETWEEN 语法中使用 AND 会与使用 AND 作为逻辑运算符时产生歧义。为解决此问题,仅允许一组有限的表达式类型作为 BETWEEN 子句的第二个参数。如果你需要在 BETWEEN 中编写更复杂的子表达式,请使用括号括起子表达式。

当任意输入为 Null 时,普通比较运算符会产生 Null(表示 "未知"),而不是 True 或 False。例如,7 = NULL 会产生 Null,如同 7 <> NULL 一样。当该行为不合适时,请使用 IS [ NOT ] DISTINCT FROM 谓词

a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b

对于非 Null 输入,IS DISTINCT FROM<> 运算符相同。但是,如果两个输入都是 Null,它将返回 False,如果仅一个输入为 Null,则它将返回 True。类似地,IS NOT DISTINCT FROM 对于非 Null 输入与 = 相同,但当两个输入都是 Null 时,它将返回 True,当仅一个输入为 Null 时,它将返回 False。因此,这些谓词有效地作用就像 NULL 是一个普通数据值,而不是 "未知"。

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

expression IS NULL
expression IS NOT NULL

或等效但非标准的谓词

expression ISNULL
expression NOTNULL

不要编写 expression = NULL,因为 NULL 不与 NULL "相等。(空值代表未知值,并且不知道两个未知值是否相等。)

提示

某些应用程序可能期望当 expression 求值为 Null 值时,expression = NULL 返回 True。强烈建议修改这些应用程序以符合 SQL 标准。但是,如果无法做到,则可以使用 transform_null_equals 配置变量。如果启用,PostgreSQL 将转换 x = NULL 子句为 x IS NULL

如果expression 是行值,则 IS NULL 在行表达式自身为 null 时或者行中的所有字段都为 null 时为 true,而 IS NOT NULL 在行表达式自身为非 null 且行中的所有字段均非 null 时为 true。由于此行为,IS NULLIS NOT NULL 并不总是返回行值表达式的否定结果;特别是包含 null 和非 null 字段的行值表达式对两个测试都将返回 false。例如

SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same');

SELECT ROW(table.*) IS NULL FROM table;  -- detect all-null rows

SELECT ROW(table.*) IS NOT NULL FROM table;  -- detect all-non-null rows

SELECT NOT(ROW(table.*) IS NOT NULL) FROM TABLE; -- detect at least one null in rows

在某些情况下,可能更愿意编写 row IS DISTINCT FROM NULLrow IS NOT DISTINCT FROM NULL,它只会在没有任何其他行字段测试的情况下检查总体行值是否为 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

即使操作数为 null,这些谓词也将始终返回 true 或 false,绝不会返回 null 值。null 输入会被视为逻辑值未知。注意,IS UNKNOWNIS NOT UNKNOWN 从本质上等同于 IS NULLIS NOT NULL,不同之处在于输入表达式必须为布尔类型。

还可以使用某些比较相关函数,如 表 9.3 所示。

表 9.3. 比较函数

函数

说明

示例

num_nonnulls ( VARIADIC "any" ) → integer

返回非 null 参数数。

num_nonnulls(1, NULL, 2)2

num_nulls ( VARIADIC "any" ) → integer

返回 null 参数数。

num_nulls(1, NULL, 2)1