可以使用通常的比较运算符,如 表 9.1 中所示。
表 9.1。比较运算符
运算符 | 说明 |
---|---|
数据类型 < 数据类型 → 布尔值 |
小于 |
数据类型 > 数据类型 → 布尔值 |
大于 |
数据类型 <= 数据类型 → 布尔值 |
小于或等于 |
数据类型 >= 数据类型 → 布尔值 |
大于或等于 |
数据类型 = 数据类型 → 布尔值 |
等于 |
数据类型 <> 数据类型 → 布尔值 |
不等于 |
数据类型 != 数据类型 → 布尔值 |
不等于 |
<>
是“不等于”的标准 SQL 表示法。!=
是别名,在解析的非常早的阶段转换为 <>
。因此,不可能实现功能不同的 !=
和 <>
运算符。
对于所有具有自然顺序的内置数据类型,都可使用这些比较运算符,包括数值、字符串和日期/时间类型。此外,如果其组件数据类型可比较,则可以比较数组、复合类型和范围。
通常还可以比较相关数据类型的值;例如 integer
>
bigint
会起作用。某些这类情况由“跨类型”比较运算符直接实现,但如果不存在此类运算符,解析器会将较不通用类型强制转换为较通用类型并应用后者的比较运算符。
如上所示,所有比较运算符都是返回 boolean
类型值的二元运算符。因此,诸如 1 < 2 < 3
的表达式是无效的(因为没有 <
运算符可以将布尔值与 3
比较)。使用下面所示的 BETWEEN
谓词来执行范围测试。
还有一些比较谓词,如在 表 9.2 中所示。它们的行为与运算符非常相似,但具有 SQL 标准要求的特殊语法。
表 9.2. 比较谓词
谓词 说明 示例 |
---|
在之间(包括范围端点)。
|
不介于(否定
|
介于,在对两个端点值进行排序后。
|
不介于,在对两个值进行排序后。
|
不等于,将空值视为可比值。
|
等于,将空值视为可比值。
|
测试值是否为空。
|
测试值是否非空。
|
测试值是否为 null(非标准语法)。 |
测试值是否不为 null(非标准语法)。 |
测试布尔表达式是否返回 true。
|
测试布尔表达式是否返回 false 或 unknown。
|
测试布尔表达式是否返回 false。
|
测试布尔表达式是否返回 true 或 unknown。
|
测试布尔表达式是否返回 unknown。
|
测试布尔表达式是否返回 true 或 false。
|
a
BETWEENx
ANDy
等效于
a
>=x
ANDa
<=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 FROMb
a
IS NOT DISTINCT FROMb
对于非 Null 输入,IS DISTINCT FROM
与 <>
运算符相同。但是,如果两个输入都是 Null,它将返回 False,如果仅一个输入为 Null,则它将返回 True。类似地,IS NOT DISTINCT FROM
对于非 Null 输入与 =
相同,但当两个输入都是 Null 时,它将返回 True,当仅一个输入为 Null 时,它将返回 False。因此,这些谓词有效地作用就像 NULL 是一个普通数据值,而不是 "未知"。
expression
IS NULLexpression
IS NOT NULL
或等效但非标准的谓词
expression
ISNULLexpression
NOTNULL
不要编写
,因为 expression
= NULLNULL
不与 NULL
"“相等”。(空值代表未知值,并且不知道两个未知值是否相等。)
某些应用程序可能期望当 expression
求值为 Null 值时,
返回 True。强烈建议修改这些应用程序以符合 SQL 标准。但是,如果无法做到,则可以使用 transform_null_equals 配置变量。如果启用,PostgreSQL 将转换 expression
= NULLx = NULL
子句为 x IS NULL
。
如果expression
是行值,则 IS NULL
在行表达式自身为 null 时或者行中的所有字段都为 null 时为 true,而 IS NOT NULL
在行表达式自身为非 null 且行中的所有字段均非 null 时为 true。由于此行为,IS NULL
和 IS 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 NULL
或 row
IS NOT DISTINCT FROM NULL
,它只会在没有任何其他行字段测试的情况下检查总体行值是否为 null。
boolean_expression
IS TRUEboolean_expression
IS NOT TRUEboolean_expression
IS FALSEboolean_expression
IS NOT FALSEboolean_expression
IS UNKNOWNboolean_expression
IS NOT UNKNOWN
即使操作数为 null,这些谓词也将始终返回 true 或 false,绝不会返回 null 值。null 输入会被视为逻辑值“未知”。注意,IS UNKNOWN
和 IS NOT UNKNOWN
从本质上等同于 IS NULL
和 IS NOT NULL
,不同之处在于输入表达式必须为布尔类型。
还可以使用某些比较相关函数,如 表 9.3 所示。
表 9.3. 比较函数