9.23. 行和数组比较

9.23.1. IN9.23.2. NOT IN9.23.3. ANY/SOME (array)9.23.4. ALL (array)9.23.5. 行构造器比较9.23.6. 组合类型比较

本节描述几个特殊的结构,用于在值的组之间进行多重比较。这些形式语法上和前面一节的子查询形式相关,但是不涉及子查询。 这种形式涉及的数组子表达式是PostgreSQL的扩展; 其它的是SQL兼容的。所有本节记录的表达式形式都返回布尔(Boolean)结果(真/假)。

9.23.1. IN

expression IN (value [, ...])

右手边是一个圆括弧包围的标量列表。如果左手边表达式的结果等于任何右手边表达式中的一个,结果为“真”。它是下面形式的缩写

expression = value1
OR
expression = value2
OR
...

请注意如果左手边表达式得到空值,或者没有相等的右手边值并且至少有一个右手边的表达式得到空值,那么IN结构的结果将为空值,而不是假。这符合 SQL 处理空值的布尔组合的一般规则。

9.23.2. NOT IN

expression NOT IN (value [, ...])

右手边是一个圆括弧包围的标量列表。如果左手边表达式的结果不等于所有右手边表达式,结果为“真”。它是下面形式的缩写

expression <> value1
AND
expression <> value2
AND
...

请注意如果左手边表达式得到空值,或者没有相等的右手边值并且至少有一个右手边的表达式得到空值,那么NOT IN结构的结果将为空值, 而不是我们可能天真地认为的真值。这符合 SQL 处理空值的布尔组合的一般规则。

提示

x NOT IN y在所有情况下都等效于NOT (x IN y)。但是,在处理空值的时候,用NOT IN比用IN更可能迷惑新手。最好尽可能用正逻辑来表达你的条件。

9.23.3. ANY/SOME (array)

expression operator ANY (array expression)
expression operator SOME (array expression)

右手边是一个圆括弧包围的表达式,它必须得到一个数组值。左手边表达式被计算并且使用给出的操作符对数组的每个元素进行比较,这个操作符必须得到布尔结果。如果得到了任何真值结果,那么ANY的结果是“真”。 如果没有找到真值结果(包括数组只有零个元素的情况),那么结果是“假”。

如果数组表达式得到一个空数组,ANY的结果将为空值。如果左手边的表达式得到空值,ANY通常是空值(尽管一个非严格比较操作符可能得到一个不同的结果)。另外,如果右手边的数组包含任何空值元素或者没有得到真值比较结果,ANY的结果将是空值而不是假(再次,假设是一个严格的比较操作符)。这符合 SQL 对空值的布尔组合的一般规则。

SOMEANY的同义词。

9.23.4. ALL (array)

expression operator ALL (array expression)

右手边是一个圆括弧包围的表达式,它必须得到一个数组值。左手边表达式将被计算并使用给出的操作符与数组的每个元素进行比较,这个操作符必须得到一个布尔结果。如果所有比较都得到真值结果,那么ALL的结果是 “真”(包括数组只有零个元素的情况)。如果有任何假值结果,那么结果是“假”。

如果数组表达式得到一个空数组,ALL的结果将为空值。如果左手边的表达式得到空值,ALL通常是空值(尽管一个非严格比较操作符可能得到一个不同的结果)。另外,如果右手边的数组包含任何空值元素或者没有得到假值比较结果,ALL的结果将是空值而不是真(再次,假设是一个严格的比较操作符)。这符合 SQL 对空值的布尔组合的一般规则。

9.23.5. 行构造器比较

row_constructor operator row_constructor

每一边都是一个行构造器,如第 4.2.13 节所述。两个行值必须具有相同数量的域。每一边被计算并且被逐行比较。当操作符是 =、 <>、 < <=、 >、 >=时,允许进行行构造器比较。每一个行元素必须是具有一个默认 B 树操作符类的类型,否则尝试比较会产生一个错误。

注意

Errors related to the number or types of elements might not occur if the comparison is resolved using earlier columns.

=<>情况略有不同。如果两行的所有对应成员都是非空且相等则这两行被认为相等;如果任何对应成员是非空但是不相等则这两行不相等;否则行比较的结果为未知(空值)。

对于<<=>>=情况,行元素被从左至右比较,在找到一处不等的或为空的元素对就立刻停下来。如果这一对元素都为空值,则行比较的结果为未知(空值);否则这一对元素的比较结果决定行比较的结果。例如,ROW(1,2,NULL) < ROW(1,3,0)得到真,而不是空值,因为第三对元素并没有被考虑。

注意

在PostgreSQL 8.2之前,<<=>>=情况不是按照每个 SQL 声明来处理的。一个像ROW(a,b) < ROW(c,d)的比较会被实现为a < c AND b < d,而结果行为等价于a < c OR (a = c AND b < d)

row_constructor IS DISTINCT FROM row_constructor

这个结构与<>行比较相似,但是它对于空值输入不会得到空值。任何空值被认为和任何非空值不相等(有区别),并且任意两个空值被认为相等(无区别)。因此结果将总是为真或为假,永远不会是空值。

row_constructor IS NOT DISTINCT FROM row_constructor

这个结构与=行比较相似,但是它对于空值输入不会得到空值。任何空值被认为和任何非空值不相等(有区别),并且任意两个空值被认为相等(无区别)。因此结果将总是为真或为假,永远不会是空值。

9.23.6. 组合类型比较

record operator record

SQL 规范要求在结果依赖于比较两个 NULL 值或者一个 NULL 与一个非 NULL 时逐行比较返回 NULL。PostgreSQL只有在比较两个行构造器(如第 9.23.5 节)的结果或者比较一个行构造器与一个子查询的输出时才这样做(如第 9.22 节中所述)。在其他比较两个组合类型值的环境中,两个 NULL 域值被认为相等,并且一个 NULL 被认为大于一个非 NULL。为了得到组合类型的一致的排序和索引行为,这样做是必要的。

每一边都会被计算并且它们会被逐行比较。当操作符是 =、 <>、 <、 <=、 >或者 >=时或者具有与这些类似的语义时,允许组合类型的比较(更准确地说,如果一个操作符是一个 B 树操作符类的成员,或者是一个 B 树操作符类的=成员的否定词,它就可以是一个行比较操作符)。 上述操作符的行为与用于行构造器(见第 9.23.5 节)的IS [ NOT ] DISTINCT FROM相同。

为了支持包含无默认 B 树操作符类的元素的行匹配,为组合类型比较定义了下列操作符: *=*<>*<*<=*>, and *>=. 这些操作符比较两行的内部二进制表达。即使两行用相等操作符的比较为真,两行也可能 具有不同的二进制表达。行在这些比较操作符之下的排序是决定性的,其他倒没什么意义。 这些操作符在内部被用于物化视图并且可能对其他如复制之类的特殊功能有用,但是它们 并不打算用在书写查询这类普通用途中。

本文转自PostgreSQL中文社区,原文链接:9.23. 行和数组比较

PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较相关推荐

  1. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.4. 额外特性

    12.4. 额外特性 12.4.1. 操纵文档12.4.2. 操纵查询12.4.3. 用于自动更新的触发器12.4.4. 收集文档统计数据 这一节描述在文本搜索中有用的一些额外的函数和操作符. 12. ...

  2. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.4. 字符串函数和操作符...

    9.4. 字符串函数和操作符 9.4.1. format 本节描述了用于检查和操作字符串值的函数和操作符.在这个环境中的串包括所有类型character.character varying和text的 ...

  3. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.15. JSON 函数和操作符...

    9.15. JSON 函数和操作符 表 9.43展示了可以用于两种 JSON 数据类型(见第 8.14 节)的操作符. 表 9.43. json和jsonb 操作符 操作符 右操作数类型 描述 例子 ...

  4. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.18. 数组函数和操作符...

    9.18. 数组函数和操作符 表 9.48显示了可以用于数组类型的操作符. 表 9.48. 数组操作符 操作符 描述 例子 结果 = 等于 ARRAY[1.1,2.1,3.1]::int[] = AR ...

  5. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.10. 位串类型

    8.10. 位串类型 位串就是一串 1 和 0 的串.它们可以用于存储和可视化位掩码.我们有两种类型的 SQL 位类型:bit(n)和bit varying(n),其中 n是一个正整数. bit类型的 ...

  6. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.11. 外部数据

    5.11. 外部数据 PostgreSQL实现了部分的SQL/MED规定,允许我们使用普通SQL查询来访问位于PostgreSQL之外的数据.这种数据被称为外部数据(注意这种用法不要和外键混淆,后者是 ...

  7. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 10 章 类型转换_10.4. 值存储

    10.4. 值存储 将被插入到一个表的值会按照下列步骤被转换到目标列的数据类型. 值存储类型转换 检查一个与目标的准确匹配. 否则,尝试转换表达式为目标类型.如果在两种类型之间的一个 赋值造型已经被注 ...

  8. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.6. 布尔类型

    8.6. 布尔类型 PostgreSQL提供标准的SQL类型boolean,参见表 8.19.boolean可以有多个状态:"true(真)"."false(假)&quo ...

  9. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.5. 修改表

    5.5. 修改表 5.5.1. 增加列5.5.2. 移除列5.5.3. 增加约束5.5.4. 移除约束5.5.5. 更改列的默认值5.5.6. 修改列的数据类型5.5.7. 重命名列5.5.8. 重命 ...

最新文章

  1. NOIP模拟 数球(思维题)
  2. 全国计算机等级考试题库二级C操作题100套(第71套)
  3. Cloud一分钟 | 阿里云发布飞天2.0操作系统;京东云串联生态伙伴专治“看病难”...
  4. 实验吧web-中-忘记密码了
  5. 锐捷交换机 查看端口流量信息
  6. 功能测试工程师想快速学习新技术?7个捷径教给你!
  7. 因果推断笔记——因果图建模之微软开源的EconML(五)
  8. HDU 4387 Stone Game (博弈)
  9. python 实现 BCH 纠错码的方法
  10. 一文带你了解隐私 Layer1
  11. 厉害了,苹果应用内购买抽成半年狂赚49亿美元
  12. ORB_SLAM2、ORB_SLAM3跑EuRocKITTI数据集及evo评估
  13. android pad office,安卓平板电脑也可以使用Office应用了
  14. 2.5元组tuple
  15. 2019年第四届天梯赛 CCCC 赛后总结(写一下)
  16. 图像处理:分水岭算法(图像分割)
  17. 基于Python的银行信用卡欺诈预测模型设计 文档+任务书+项目源码及数据
  18. BetaFlight开源工程结构简明介绍
  19. 【洛谷 P1046】[NOIP2005 普及组] 陶陶摘苹果 题解(比较)
  20. [二十三]JavaIO之PushbackReader

热门文章

  1. html怎么只操作第一个li,css3如何选择第一个子元素?
  2. java 什么是内部类_讨论Java中的内部类是什么?
  3. acm java输入输出_ACM中java如何快速输入输出
  4. L2-031 深入虎穴 (25 分)-PAT 团体程序设计天梯赛 GPLT
  5. [Python] L1-034. 点赞 团体程序设计天梯赛GPLT
  6. 蓝桥杯 ADV-177算法提高 理财计划
  7. 利用python对excel文件进行操作_数据处理-对Excel文件读取和操作和存储(python版)...
  8. Perl调用shell命令方法小结
  9. echarts3.0 本期累计堆叠
  10. WinForm DataGridView 中的小bug.