常见的比较操作符都可用,如Table 9.1所示。
Table 9.1. 比较操作符
| 操作符 | 描述 |
|---|---|
datatype < datatype → boolean |
小于 |
datatype > datatype → boolean |
大于 |
datatype <= datatype → boolean |
小于等于 |
datatype >= datatype → boolean |
大于等于 |
datatype = datatype → boolean |
等于 |
datatype <> datatype → boolean |
不等于 |
datatype != datatype → boolean |
不等于 |
<> 表示 “not equal” 的标准的SQL符号。 != 是一个别名, 在解析的早期阶段被转换为 <> 。 因此, 它不可能实现 != 和 <> 操作符以做不同的事情。
这些比较操作符适用于所有具有自然排序的内置数据类型,包括数字、字符串和日期/时间类型。 此外,如果其组成数据类型具有可比性,则也可以比较数组、复合类型和范围。
通常也可以比较相关数据类型的值;例如integer > bigint 将起作用。 这种情况中的一部分直接由“跨类型”比较操作符实现;但如果没有这样的操作符,解析器就会把较不通用的类型强制转换为较通用的类型,并应用后者的比较操作符。
如上所示,所有比较操作符都是二元操作符,返回boolean类型的值。 因此,类似1 < 2 < 3的表达式是无效的,因为没有<操作符可将 3 与布尔值比较。 使用下面显示的BETWEEN谓词执行范围测试。
如Table 9.2所示,也有一些比较谓词。它们的行为和操作符很像,但是具有 SQL 标准所要求的特殊语法。
Table 9.2. 比较谓词
|
谓词 描述 示例 |
|---|
|
之间(包括范围端点)。
|
|
不在范围内(
|
|
在对两个端点值排序之后判断是否在其间
|
|
在对两个端点值排序之后判断是否不在其间
|
|
不相等, 将空(null)视为可比值。
|
|
相等, 将空(null)视为可比值。
|
|
测试值是否为空。
|
|
测试值是否不为空。
|
|
测试值是否为空(非标准语法)。 |
|
测试值是否不为空(非标准语法)。 |
|
测试布尔表达式是否为真。
|
|
测试布尔表达式是否为假或未知。
|
|
测试布尔表达式是否为假。
|
|
测试布尔表达式是否为真或未知。
|
|
测试布尔表达式是否为未知。
|
|
测试布尔表达式是否为真或假。
|
aBETWEENxANDy
等效于
a>=xANDa<=y
注意BETWEEN认为终点值是包含在范围内的。 BETWEEN SYMMETRIC 就像BETWEEN,除了没有要求AND的左边的参数小于或等于右边的参数。 如果不是的话,这两个参数将自动交换,因此总是隐含一个非空范围。
BETWEEN的各种变量都是以普通比较操作符的方式实现的,因此适用于任何可以比较的数据类型。
在BETWEEN语法中使用AND会与使用AND作为逻辑操作符产生歧义。 为了解决这个问题,只允许有限的一组表达类型作为BETWEEN子句的第二个参数。 如果您需要在BETWEEN中写一个更复杂的子表达式,在子表达式两边写上圆括号。
当有一个输入为空时,普通的比较操作符会得到空(表示“未知”),而不是真或假。例如,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 字段的行值表达式会对这两种测试都返回假。例如:
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
这些谓词将总是返回真或假,从来不返回空值,即使操作数是空也如此。空值输入被当做逻辑值“未知”。 请注意实际上IS UNKNOWN和IS NOT UNKNOWN分别与IS NULL和IS NOT NULL相同, 只是输入表达式必须是布尔类型。
如Table 9.3中所示,也有一些比较相关的函数可用。
Table 9.3. 比较函数
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。