# 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不同于NULL → t (而不是无效的 )NULL与NULL不同 → f (而不是无效的 ) |
数据类型 与…没有区别 数据类型 → 布尔值 相等,将null视为可比值。 1与NULL没有区别 → f (而不是无效的 )NULL与NULL没有区别 → t (而不是无效的 ) |
数据类型 是空的 → 布尔值 测试值是否为空。 1.5为空 → f |
数据类型 不是空的 → 布尔值 测试值是否为空。 “null”不是null → t |
数据类型 ISNULL → 布尔值 测试值是否为null(非标准语法)。 |
数据类型 NOTNULL → 布尔值 测试值是否不为null(非标准语法)。 |
布尔值 这是真的 → 布尔值 测试布尔表达式是否为真。 真的是真的 → t 布尔是真的 → f (而不是无效的 ) |
布尔值 这不是真的 → 布尔值 测试布尔表达式是否生成false或unknown。 真的不是真的 → f 布尔值不是真的 → t (而不是无效的 ) |
布尔值 这是假的 → 布尔值 测试布尔表达式是否产生false。 真是假 → f 布尔值为FALSE → f (而不是无效的 ) |
布尔值 这不是假的 → 布尔值 测试布尔表达式是否生成true或unknown。 真的不是假的 → t NULL::boolean不是FALSE → t (而不是无效的 ) |
布尔值 未知 → 布尔值 测试布尔表达式是否产生未知结果。 真相不得而知 → 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是一个正常的数据值,而不是“未知的”。
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. |