# 9.2.比较函数和运算符

可以使用常用的比较运算符,如中所示表9.1.

表9.1.比较运算符

操作人员 描述
数据类型 < *数据类型*→布尔值 少于
数据类型 > *数据类型*→布尔值 大于
数据类型 <= *数据类型*→布尔值 小于或等于
数据类型 >= *数据类型*→布尔值 大于或等于
数据类型 = 数据类型布尔值 相同的
数据类型 <> 数据类型布尔值 不平等
数据类型 != 数据类型布尔值 不平等

# 笔记

<>是“不相等”的标准SQL表示法。!=是一个别名,转换为<>在分析的早期阶段。因此,不可能实施!=<>做不同事情的操作员。

这些比较运算符适用于具有自然顺序的所有内置数据类型,包括数字、字符串和日期/时间类型。此外,如果数组、复合类型和范围的组件数据类型具有可比性,则可以对它们进行比较。

通常也可以比较相关数据类型的值;例如整数 > 比基特会有用的。这种类型的某些情况是通过“交叉类型”比较运算符直接实现的,但如果没有此类运算符可用,解析器会将不太通用的类型强制为更通用的类型,并应用后者的比较运算符。

如上所示,所有比较运算符都是返回类型为的值的二进制运算符布尔值.因此1 < 2 < 3无效(因为没有<运算符将布尔值与3.).使用之间用于执行范围测试的谓词如下所示。

还有一些比较谓词,如中所示表9.2.它们的行为很像运算符,但具有SQL标准强制要求的特殊语法。

表9.2.比较谓词

谓语

描述

例子
数据类型 之间 数据类型 数据类型布尔值

之间(包括范围端点)。

2介于1和3之间t

2在3和1之间f
数据类型 不在中间 数据类型 数据类型布尔值

不在(否定)之间之间).

2不在1到3之间f
数据类型 对称的 数据类型 数据类型布尔值

在对两个端点值进行排序之后。

2在对称的3和1之间t
数据类型 不是对称的 数据类型 数据类型布尔值

在对两个端点值进行排序后,不在两者之间。

2不在对称3和1之间f
数据类型 有别于 数据类型布尔值

不相等,将null视为可比值。

1不同于NULLt(而不是无效的)

NULL与NULL不同f(而不是无效的)
数据类型 与…没有区别 数据类型布尔值

相等,将null视为可比值。

1与NULL没有区别f(而不是无效的)

NULL与NULL没有区别t(而不是无效的)
数据类型 是空的布尔值

测试值是否为空。

1.5为空f
数据类型 不是空的布尔值

测试值是否为空。

“null”不是nullt
数据类型 ISNULL布尔值

测试值是否为null(非标准语法)。
数据类型 NOTNULL布尔值

测试值是否不为null(非标准语法)。
布尔值 这是真的布尔值

测试布尔表达式是否为真。

真的是真的t

布尔是真的f(而不是无效的)
布尔值 这不是真的布尔值

测试布尔表达式是否生成false或unknown。

真的不是真的f

布尔值不是真的t(而不是无效的)
布尔值 这是假的布尔值

测试布尔表达式是否产生false。

真是假f

布尔值为FALSEf(而不是无效的)
布尔值 这不是假的布尔值

测试布尔表达式是否生成true或unknown。

真的不是假的t

NULL::boolean不是FALSEt(而不是无效的)
布尔值 未知布尔值

测试布尔表达式是否产生未知结果。

真相不得而知f

NULL::boolean未知t(而不是无效的)
布尔值 这并非未知布尔值

测试布尔表达式是否产生true或false。

事实并非未知t

布尔值不是未知的f(而不是无效的)

这个之间范围测试:

a BETWEEN x AND y

相当于

a >= x AND a <= y

注意之间将端点值视为包含在范围内。对称的就像之间除了不要求参数在小于或等于右边的论点。如果不是,这两个参数将自动交换,因此始终隐含非空范围。

各种各样的之间根据普通比较运算符实现,因此将适用于任何可比较的数据类型。

# 笔记

使用之间语法通过使用作为逻辑运算符。为了解决这个问题,只允许有限的表达式类型集作为之间条款如果你需要写一个更复杂的子表达式之间,在子表达式周围写上括号。

当任一输入为null时,普通比较运算符都会产生null(表示“未知”),而不是true或false。例如7=空结果为空,也是如此7<>空.当这种行为不合适时,请使用与…不同谓词:

a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b

对于非空输入,有别于<>操作人员但是,如果两个输入都为null,则返回false;如果只有一个输入为null,则返回true。同样地,与…没有区别与相同=对于非空输入,但当两个输入都为空时返回true,当只有一个输入为空时返回false。因此,这些谓词的有效行为就好像null是一个正常的数据值,而不是“未知的”。

要检查值是否为null,请使用谓词:

expression IS NULL
expression IS NOT NULL

或等效但非标准的谓词:

expression ISNULL
expression NOTNULL

*表示*=NULL因为无效的不等于无效的(空值表示未知值,不知道两个未知值是否相等。)

# 提示

一些应用程序可能会想到这一点*表示*=NULL如果*表示*计算结果为空值。强烈建议修改这些应用程序以符合SQL标准。然而,如果不能做到这一点使改变_无效的_等于配置变量可用。如果启用,PostgreSQL将转换x=NULL条款至x是空的.

如果*表示那么,行值吗是空的当行表达式本身为null或行的所有字段均为null时为true,而不是空的当行表达式本身为非null且所有行的字段均为非null时,为true。因为这种行为,是空的不是空的不要总是为行值表达式返回相反的结果;特别是,同时包含null和非null字段的行值表达式对于这两个测试都将返回false。在某些情况下,写作可能更可取一行* 与NULL不同或*一行* 与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

即使操作数为空,它们也将始终返回true或false,永远不会返回空值。空输入被视为逻辑值“未知”。注意未知这并非未知实际上与是空的不是空的,但输入表达式必须是布尔类型。

还提供了一些与比较相关的功能,如中所示表9.3.

表9.3.比较函数

作用

描述

例子
num_nonnulls ( 可变的 “任何” ) → 整数

返回非空参数的数量。

num_nonnull(1,NULL,2)2.
num_nulls ( 可变的 “任何” ) → 整数

返回空参数的数量。

num_nulls(1,NULL,2)1.