通常的比较运算符可用,如表 9.1所示。
表 9.1. 比较运算符
运算符 | 描述 |
---|---|
datatype < datatype → boolean |
小于 |
datatype > datatype → boolean |
大于 |
datatype <= datatype → boolean |
小于或等于 |
datatype >= datatype → boolean |
大于或等于 |
datatype = datatype → boolean |
等于 |
datatype <> datatype → boolean |
不等于 |
datatype != datatype → boolean |
不等于 |
<>
是 “不等于” 的标准 SQL 表示法。 !=
是一个别名,在解析的非常早期的阶段转换为 <>
。 因此,无法实现执行不同操作的 !=
和 <>
运算符。
这些比较运算符可用于所有具有自然顺序的内置数据类型,包括数字、字符串和日期/时间类型。 此外,如果数组、复合类型和范围的组件数据类型可以比较,则可以比较它们。
通常可以比较相关数据类型的值;例如 integer
>
bigint
将起作用。 这种类型的一些情况是由 “跨类型” 比较运算符直接实现的,但如果没有此类运算符可用,解析器将强制较不一般的类型为更一般的类型,并应用后者的比较运算符。
如上所示,所有比较运算符都是返回 boolean
类型的值的二元运算符。 因此,像 1 < 2 < 3
这样的表达式无效(因为没有 <
运算符可以比较布尔值和 3
)。 使用下面显示的 BETWEEN
谓词执行范围测试。
还有一些比较谓词,如表 9.2所示。 这些谓词的行为类似于运算符,但具有 SQL 标准规定的特殊语法。
表 9.2. 比较谓词
谓词 描述 示例 |
---|
介于(包括范围端点)之间。
|
不介于(
|
介于,在对两个端点值进行排序后。
|
不介于,在对两个端点值进行排序后。
|
不等于,将 null 视为可比较的值。
|
等于,将 null 视为可比较的值。
|
测试值是否为 null。
|
测试值是否不为 null。
|
测试值是否为 null(非标准语法)。 |
测试值是否不为 null(非标准语法)。 |
测试布尔表达式是否产生真值。
|
测试布尔表达式是否产生假值或未知值。
|
测试布尔表达式是否产生假值。
|
测试布尔表达式是否产生真值或未知值。
|
测试布尔表达式是否产生未知值。
|
测试布尔表达式是否产生真值或假值。
|
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
对于非空输入,IS DISTINCT FROM
等同于 <>
运算符。但是,如果两个输入都是 null,它将返回 false,如果只有一个输入是 null,它将返回 true。类似地,IS NOT DISTINCT FROM
对于非空输入与 =
相同,但当两个输入都是 null 时返回 true,当只有一个输入是 null 时返回 false。因此,这些谓词有效地将 null 视为一个正常的数值,而不是 “未知”。
为了检查一个值是否为 null 或不为 null,可以使用以下谓词
expression
IS NULLexpression
IS NOT NULL
或者等效的,但非标准的谓词
expression
ISNULLexpression
NOTNULL
请 不要 写
,因为 expression
= NULLNULL
不 “等于” NULL
。(null 值表示一个未知的值,不知道两个未知的值是否相等。)
一些应用程序可能会期望
在 expression
= NULLexpression
评估为 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 NULL
和 IS NOT 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
这些将始终返回 true 或 false,绝不返回 null 值,即使操作数为 null。null 输入将被视为逻辑值 “未知”。请注意,IS UNKNOWN
和 IS NOT UNKNOWN
实际上与 IS NULL
和 IS NOT NULL
相同,只是输入表达式必须是布尔类型。
一些与比较相关的函数也可用,如 表 9.3 所示。
表 9.3. 比较函数
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表格 报告文档问题。