PostgreSQL 比较函数和操作符
常见的比较操作符都可用,如表 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
| 不等于 |
注意
<>
表示 “not equal” 的标准的SQL符号。
!=
是一个别名, 在解析的早期阶段被转换为 <>
。
因此, 它不可能实现 !=
和 <>
操作符以做不同的事情。
这些比较操作符适用于所有具有自然排序的内置数据类型,包括数字、字符串、和日期/时间类型。 此外,如果它们的组件数据类型具有可比性,则可以比较阵列、复合类型和范围。
通常也可以比较相关数据类型的值;例如integer
>
bigint
将起作用。
这种排序的某些情况直接由“cross-type” 比较操作符实现,但是,如果没有这种操作符,解析器将把不太通用的类型强制为更通用的类型,并应用后者的比较操作符。
如上所示,所有比较操作符都是二元操作符,返回boolean
类型的值。
因此,类似1 < 2 < 3
的表达式是无效的。因为没有<
操作符与 3
进行Boolean值比较)。
使用下面显示的BETWEEN
谓词执行范围测试。
如表 9.2所示,也有一些比较谓词。它们的行为和操作符很像,但是具有 SQL 标准所要求的特殊语法。
表 9.2. 比较谓词
谓词 描述 示例(s) |
---|
之间(包括范围端点)。
|
不在之间 (
|
之间, 在对两个端点值排序之后。
|
不在之间, 在对两个端点值排序之后。
|
不相等, 将空(null)视为可比值。
|
相等, 将空(null)视为可比值。
|
测试值是否为空。
|
测试值是否不为空。
|
测试值是否为空(非标准语法)。 |
测试值是否不为空(非标准语法)。 |
测试布尔表达式是否为真。
|
测试布尔表达式是否为假或未知。
|
测试布尔表达式是否为假。
|
测试布尔表达式是否为真或未知。
|
测试布尔表达式是否为未知。
|
测试布尔表达式是否为真或假。
|
a BETWEEN x AND y
等效于
a >= x AND a <= y
注意BETWEEN
认为终点值是包含在范围内的。
BETWEEN SYMMETRIC
就像BETWEEN
,除了没有要求AND
的左边的参数小于或等于右边的参数。
如果不是的话,这两个参数将自动交换,因此总是隐含一个非空范围。。
BETWEEN
的各种变量都是以普通比较操作符的方式实现的,因此适用于任何可以比较的数据类型。
注意
在BETWEEN
语法中使用AND
会与使用AND
作为逻辑操作符产生歧义。
为了解决这个问题,只允许有限的一组表达类型作为BETWEEN
子句的第二个参数。
如果您需要在BETWEEN
中写一个更复杂的子表达式,在子表达式两边写上圆括号。
当有一个输入为空时,普通的比较操作符会得到空(表示“未知”),而不是真或假。例如,7 = NULL
得到空,7 <> NULL
也一样。如果这种行为不合适,可以使用IS [ NOT ] DISTINCT FROM
谓词:
a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b
对于非空输入,IS DISTINCT FROM
和<>
操作符一样。不过,如果两个输入都为空,它会返回假。而如果只有一个输入为空,它会返回真。类似地,IS NOT DISTINCT FROM
对于非空输入的行为与=
相同,但是当两个输入都为空时它返回真,并且当只有一个输入为空时返回假。因此,这些谓词实际上把空值当作一种普通数据值而不是“unknown”。
expression IS NULL expression IS NOT NULL
或者等效,但并不标准的谓词:
expression ISNULL
expression NOTNULL
不要写
,因为expression
= NULLNULL
是不“等于”NULL
的(控制代表一个未知的值,因此我们无法知道两个未知的数值是否相等)。
提示
有些应用可能要求表达式
在expression
= NULLexpression
得出空值时返回真。我们强烈建议这样的应用修改成遵循 SQL 标准。但是,如果这样修改不可能完成,那么我们可以使用配置变量transform_null_equals。如果打开它,PostgreSQL将把x = NULL
子句转换成x IS NULL
。
如果expression
是行值,那么当行表达式本身为非空值或者行的所有域为非空时IS NULL
为真。由于这种行为,IS NULL
和IS NOT NULL
并不总是为行值表达式返回反转的结果,特别是,一个同时包含 NULL 和非空值的域将会对两种测试都返回假。在某些情况下,写成row
IS DISTINCT FROM NULL
或者row
IS NOT DISTINCT FROM 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
这些谓词将总是返回真或假,从来不返回空值,即使操作数是空也如此。空值输入被当做逻辑值“未知”。 请注意实际上IS UNKNOWN
和IS NOT UNKNOWN
分别与IS NULL
和IS NOT NULL
相同, 只是输入表达式必须是布尔类型。
如表 9.3中所示,也有一些比较相关的函数可用。
表 9.3. 比较函数