暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[翻译PG]比较函数和操作符

原创 seagull 2023-03-17
166



9.2. 比较函数和操作符


常见的比较操作符都可用,如表 9.1所示。

表 9.1. 比较操作符

操作符 描述
< 小于
> 大于
<= 小于等于
>= 大于等于
= 等于
<> or != 不等于


注意

!=操作符在分析器阶段被转换成<>。不能把!=<>操作符实现为做不同的事。

比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,它们返回boolean类型;类似于1 < 2 < 3的表达式是非法的(因为没有<操作符可以比较一个布尔值和3)。

表 9.2所示,也有一些比较谓词。它们的行为和操作符很像,但是具有 SQL 标准所要求的特殊语法。

表 9.2. 比较谓词

谓词 描述
a BETWEEN x AND y xy之间
a NOT BETWEEN x AND y 不在xy之间
a BETWEEN SYMMETRIC x AND y 在对比较值排序后位于xy之间
a NOT BETWEEN SYMMETRIC x AND y 在对比较值排序后不位于xy之间
a IS DISTINCT FROM b 不等于,空值被当做一个普通值
a IS NOT DISTINCT FROM b 等于,空值被当做一个普通值
expression IS NULL 是空值
expression IS NOT NULL 不是空值
expression ISNULL 是空值(非标准语法)
expression NOTNULL 不是空值(非标准语法)
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 为真或者为假


BETWEEN谓词可以简化范围测试:

a BETWEEN x AND y
复制

等效于

a >= x AND a <= y
复制

注意BETWEEN认为终点值是包含在范围内的。 NOT BETWEEN可以做相反比较:

a NOT BETWEEN x AND y
复制

等效于

a < x OR a > y
复制

BETWEEN SYMMETRICBETWEEN相似,不过BETWEEN SYMMETRIC不要求AND左边的参数小于或等于右边的参数。如果左参数不是小于等于右参数,这两个参数会自动被交换,这样总是会应用一个非空范围。

当有一个输入为空时,普通的比较操作符会得到空(表示”),而不是真或假。例如,7 = NULL得到空,7 <> NULL也一样。如果这种行为不合适,可以使用IS [] DISTINCT FROM谓词:

a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b
复制

对于非空输入,IS DISTINCT FROM<>操作符一样。不过,如果两个输入都为空,它会返回假。而如果只有一个输入为空,它会返回真。类似地,IS NOT DISTINCT FROM对于非空输入的行为与=相同,但是当两个输入都为空时它返回真,并且当只有一个输入为空时返回假。因此,这些谓词实际上把空值当作一种普通数据值而不是”。

要检查一个值是否为空,使用下面的谓词:

expression IS NULL
expression IS NOT NULL
复制

或者等效,但并不标准的谓词:

expression ISNULL
expression NOTNULL
复制

expression = NULL,因为NULL是不”NULL的(控制代表一个未知的值,因此我们无法知道两个未知的数值是否相等)。

提示

有些应用可能要求表达式expression = NULLexpression得出空值时返回真。我们强烈建议这样的应用修改成遵循 SQL 标准。但是,如果这样修改不可能完成,那么我们可以使用配置变量transform_null_equals。如果打开它,将把x = NULL子句转换成x IS NULL

如果expression是行值,那么当行表达式本身为非空值或者行的所有域为非空时IS NULL为真。由于这种行为,IS NULLIS 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 UNKNOWNIS NOT UNKNOWN分别与IS NULLIS NOT NULL相同, 只是输入表达式必须是布尔类型。

表 9.3中所示,也有一些比较相关的函数可用。

表 9.3. 比较函数

函数 描述 例子 例子结果
num_nonnulls(VARIADIC "any") 返回非空参数的数量 num_nonnulls(1, NULL, 2) 2
num_nulls(VARIADIC "any") 返回空参数的数量 num_nulls(1, NULL, 2) 1




「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论