博客
关于我
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
阅读量:795 次
发布时间:2023-03-03

本文共 2783 字,大约阅读时间需要 9 分钟。

9.23 行和数组比较

本节描述几个特殊的结构,用于在值的组之间进行多重比较。这些形式语法上和前面一节的子查询形式相关,但不涉及子查询。这类表达式主要用于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 ININ 更可能迷惑新手。最好尽可能使用正逻辑来表达你的条件。


9.23.3 ANY / SOME (array)

语法

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

说明

右侧是一个圆括弧包围的表达式,必须返回数组值。左侧表达式被计算并与数组中的每个元素进行比较,比较结果必须为布尔值。如果任何比较结果为“真”,则ANY/SOME结果为“真”;如果没有找到“真”结果(包括数组为空的情况),结果为“假”。

注意事项

  • 如果数组表达式返回空数组,则ANY/SOME结果为空值。
  • 如果左侧表达式结果为空值,则ANY/SOME通常返回空值(尽管非严格比较操作符可能有不同结果)。
  • 如果右侧数组包含空值元素或没有得到“真”比较结果,则ANY/SOME结果为空值而不是“假”(假设是严格比较操作符)。这符合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

说明

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

行比较规则

  • 等式=和不等式<>

    • 如果两行的所有对应成员都是非空且相等,则两行被认为相等;
    • 如果任何对应成员是非空但不相等,则两行不相等;
    • 否则(存在空值),行比较结果为未知(空值)。
  • 小于、小于等于、大于、大于等于

    • 行元素从左到右逐一比较,直到找到一对不等的或为空的元素对;
    • 如果这一对元素都为空值,则行比较结果为未知(空值);
    • 否则,该对元素的比较结果决定行比较结果。
  • 注意事项

    • 在PostgreSQL 8.2之前,对<、<=、>、>=操作符的处理与当前不同。例如,ROW(a,b) < ROW(c,d) 会被实现为 a < c AND b < d,结果等效于 a < c OR (a = c AND b < d)

    9.23.6 行构造器IS DISTINCT FROM / IS NOT DISTINCT FROM

    语法

    row_constructor IS DISTINCT FROM row_constructorrow_constructor IS NOT DISTINCT FROM row_constructor

    说明

    • IS DISTINCT FROM

      • =行比较相似,但空值输入不会得到空值;
      • 任何空值被认为与任何非空值不相等(有区别),且任意两个空值被认为相等(无区别);
      • 结果总是为“真”或“假”,永远不会为空值。
    • IS NOT DISTINCT FROM

      • =行比较相似,但空值输入不会得到空值;
      • 任何空值被认为与任何非空值不相等(有区别),且任意两个空值被认为相等(无区别);
      • 结果总是为“真”或“假”,永远不会为空值。

    9.23.7 组合类型比较

    语法

    record operator record

    说明

    SQL规范要求在结果依赖于比较两个NULL值或一个NULL与一个非NULL时逐行比较返回NULL。PostgreSQL仅在以下情况下这样做:

    • 比较两个行构造器(如ROW)的结果;
    • 或者比较一个行构造器与一个子查询的输出(如中所述)。

    在其他比较两个组合类型值的环境中,两个NULL域值被认为相等,并且一个NULL被认为大于一个非NULL。为了得到组合类型的一致的排序和索引行为,这种处理是必要的。

    组合类型比较操作符

    PostgreSQL还定义了以下操作符用于比较包含无默认B树操作符类元素的行:

    • *=
    • *<>
    • *<
    • *<=
    • >*
    • *>=

    这些操作符比较两行的内部二进制表达,即使两行用=操作符比较为真,两行也可能具有不同的二进制表达。行在这些比较操作符之下的排序是决定性的,其他倒没什么意义。

    这些操作符在内部用于物化视图,并可能对其他如复制之类的特殊功能有用,但它们并不打算用于书写查询等普通用途中。


    本文转自PostgreSQL中文社区,原文链接:链接

    转载地址:http://pnxfk.baihongyu.com/

    你可能感兴趣的文章
    POJ 2484 A Funny Game(神题!)
    查看>>
    POJ 2486 树形dp
    查看>>
    POJ 2488:A Knight&#39;s Journey
    查看>>
    SpringBoot为什么易学难精?
    查看>>
    poj 2545 Hamming Problem
    查看>>
    poj 2723
    查看>>
    poj 2763 Housewife Wind
    查看>>
    Qt笔记——模型/视图MVD 文件目录浏览器软件
    查看>>
    POJ 2892 Tunnel Warfare(树状数组+二分)
    查看>>
    poj 2965 The Pilots Brothers' refrigerator-1
    查看>>
    poj 3026( Borg Maze BFS + Prim)
    查看>>
    POJ 3041 - 最大二分匹配
    查看>>
    POJ 3041 Asteroids(二分匹配模板题)
    查看>>
    Qt笔记——标准文件对话框QFileDialog
    查看>>
    poj 3083 Children of the Candy Corn
    查看>>
    POJ 3083 Children of the Candy Corn 解题报告
    查看>>
    POJ 3253 Fence Repair C++ STL multiset 可解 (同51nod 1117 聪明的木匠)
    查看>>
    Qt笔记——控件总结
    查看>>
    poj 3262 Protecting the Flowers 贪心
    查看>>
    poj 3264(简单线段树)
    查看>>