常见的比较操作符都可用,如Table 9.1所示。
Table 9.1. 比较操作符
| 操作符 | 描述 |
|---|---|
< |
小于 |
> |
大于 |
<= |
小于或等于 |
>= |
大于或等于 |
= |
等于 |
<> 或 != |
不等于 |
!= 操作符在解析器阶段会转换为 <>。不可能实现行为不同的 != 和 <> 操作符。
比较操作符适用于所有相关的数据类型。所有比较操作符都是返回 boolean 类型值的二元操作符;类似 1 < 2 < 3 的表达式是无效的(因为没有用于比较布尔值和 3 的 < 操作符)。
如Table 9.2所示,也有一些比较谓词。它们的行为和操作符很像,但是具有 SQL 标准所要求的特殊语法。
Table 9.2. 比较谓词
| 谓词 | 描述 |
|---|---|
a BETWEEN x AND y |
位于两者之间 |
a NOT BETWEEN x AND y |
不位于两者之间 |
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 NULL |
为 null |
expression IS NOT NULL |
不为 null |
expression ISNULL |
为 null(非标准语法) |
expression NOTNULL |
不为 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 |
为真或假 |
aBETWEENxANDy
等价于
a>=xANDa<=y
注意,BETWEEN将两个端点值都视为包含在范围内。NOT BETWEEN执行相反的比较:
aNOT BETWEENxANDy
等价于
a<xORa>y
BETWEEN SYMMETRIC类似于BETWEEN,但不要求AND左侧的参数小于或等于右侧的参数。如果不是这样,这两个参数会自动交换,以确保表示的范围始终非空。
当有一个输入为空时,普通的比较操作符会得到空(表示“未知”),而不是真或假。例如,7 = NULL得到空,7 <> NULL也一样。如果这种行为不合适,可以使用IS [ NOT ] DISTINCT FROM谓词:
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
对于非空输入,IS DISTINCT FROM和<>操作符一样。不过,如果两个输入都为空,它会返回假。而如果只有一个输入为空,它会返回真。类似地,IS NOT DISTINCT FROM对于非空输入的行为与=相同,但是当两个输入都为空时它返回真,并且当只有一个输入为空时返回假。因此,这些谓词实际上把空值当作一种普通数据值,而不是“未知”。
expressionIS NULLexpressionIS NOT NULL
或者等效但非标准的谓词:
expressionISNULLexpressionNOTNULL
不要写,因为expression = NULLNULL并不“等于”NULL。(null 值表示未知值,而我们并不知道两个未知值是否相等。)
有些应用可能要求表达式在expression = NULLexpression得出空值时返回真。我们强烈建议这样的应用修改成遵循 SQL 标准。但是,如果这样修改不可能完成,那么我们可以使用配置变量transform_null_equals。如果打开它,PostgreSQL将把x = NULL子句转换成x IS NULL。
如果expression是行值,那么当行表达式本身为 null 或其所有字段都为 null 时,IS NULL 为真;而当行表达式本身非 null 且其所有字段都非 null 时,IS NOT NULL 为真。由于这种行为,IS NULL和IS NOT NULL并不总是对行值表达式返回相反的结果;特别是,一个同时包含 null 和非 null 字段的行值表达式会对这两种测试都返回假。在某些情况下,写成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
这些谓词将总是返回真或假,从来不返回空值,即使操作数为空也如此。空值输入被当作逻辑值“未知”。请注意,IS UNKNOWN和IS NOT UNKNOWN实际上分别等同于IS NULL和IS NOT NULL,只是输入表达式必须是布尔类型。
如Table 9.3中所示,也有一些比较相关的函数可用。
Table 9.3. 比较函数