常用的比较操作符可用,如表 9.1所示。
表 9.1. 比较操作符
| 操作符 | 描述 |
|---|---|
数据类型 < 数据类型 → boolean |
小于 |
数据类型 > 数据类型 → boolean |
大于 |
数据类型 <= 数据类型 → boolean |
小于或等于 |
数据类型 >= 数据类型 → boolean |
大于或等于 |
数据类型 = 数据类型 → boolean |
等于 |
数据类型 <> 数据类型 → boolean |
不等于 |
数据类型 != 数据类型 → boolean |
不等于 |
<> 是 “不等于” 的标准 SQL 表示法。!= 是一个别名,在解析的早期阶段被转换为 <>。 因此,不可能实现执行不同操作的 != 和 <> 操作符。
这些比较操作符适用于所有具有自然顺序的内置数据类型,包括数值、字符串和日期/时间类型。此外,如果数组、复合类型和范围的组件数据类型可比较,则它们也可以进行比较。
通常也可以比较相关数据类型的值;例如,integer > bigint 将起作用。 这种情况的某些情况直接由“跨类型”比较操作符实现,但如果没有这样的操作符可用,解析器会将不太通用的类型强制转换为更通用的类型,并应用后者的比较操作符。
如上所示,所有比较操作符都是返回 boolean 类型值的二元操作符。 因此,诸如 1 < 2 < 3 之类的表达式是无效的(因为没有 < 操作符来将布尔值与 3 进行比较)。 请使用下面显示的 BETWEEN 谓词来执行范围测试。
还有一些比较谓词,如表 9.2所示。 它们的行为很像操作符,但具有 SQL 标准规定的特殊语法。
表 9.2. 比较谓词
|
谓词 描述 示例 |
|---|
|
介于(包含范围端点)。
|
|
不介于(
|
|
介于,在对两个端点值进行排序之后。
|
|
不介于,在对两个端点值进行排序之后。
|
|
不等于,将 null 视为可比较的值。
|
|
等于,将 null 视为可比较的值。
|
|
测试值是否为 null。
|
|
测试值是否不为 null。
|
|
测试值是否为 null(非标准语法)。 |
|
测试值是否不为 null(非标准语法)。 |
|
测试布尔表达式是否产生 true。
|
|
测试布尔表达式是否产生 false 或未知。
|
|
测试布尔表达式是否产生 false。
|
|
测试布尔表达式是否产生 true 或未知。
|
|
测试布尔表达式是否产生未知。
|
|
测试布尔表达式是否产生 true 或 false。
|
aBETWEENxANDy
等价于
a>=xANDa<=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 谓词。
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
对于非 null 输入,IS DISTINCT FROM 与 <> 运算符相同。但是,如果两个输入都为 null,它将返回 false;如果只有一个输入为 null,则返回 true。类似地,对于非 null 输入,IS NOT DISTINCT FROM 与 = 相同,但当两个输入都为 null 时返回 true,当只有一个输入为 null 时返回 false。因此,这些谓词实际上表现得好像 null 是一个普通的数据值,而不是“未知”。
expressionIS NULLexpressionIS NOT NULL
或等效的但非标准的谓词
expressionISNULLexpressionNOTNULL
不要写 ,因为 expression = NULLNULL 不“等于” NULL。(null 值表示一个未知值,并且不知道两个未知值是否相等。)
某些应用程序可能期望如果 expression 求值为 null 值,则 返回 true。强烈建议修改这些应用程序以符合 SQL 标准。但是,如果无法做到这一点,则可以使用 transform_null_equals 配置变量。如果启用它,PostgreSQL 将把 expression = NULLx = NULL 子句转换为 x IS NULL。
如果 expression 是行值,则当行表达式本身为 null 或当行的所有字段均为 null 时,IS NULL 为 true;而当行表达式本身为非 null 且行的所有字段均为非 null 时,IS NOT 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_expressionIS TRUEboolean_expressionIS NOT TRUEboolean_expressionIS FALSEboolean_expressionIS NOT FALSEboolean_expressionIS UNKNOWNboolean_expressionIS NOT UNKNOWN
这些将始终返回 true 或 false,而不是 null 值,即使操作数为 null 也是如此。null 输入被视为逻辑值“未知”。请注意,IS UNKNOWN 和 IS NOT UNKNOWN 实际上分别与 IS NULL 和 IS NOT NULL 相同,只是输入表达式必须为布尔类型。
某些与比较相关的函数也可用,如 表 9.3 所示。
表 9.3. 比较函数
如果您在文档中看到任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。