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

【翻译PG】 UNION、CASE和相关结构

原创 seagull 2023-11-09
204

 UNIONCASE和相关结构

SQL UNION结构必须使可能不相似的类型匹配成为一个单一的结果集。该决定算法被独立地应用到一个联合查询的每个输出列。INTERSECTEXCEPT采用和UNION相同的方法来决定不相似的类型。CASEARRAYVALUESGREATESTLEAST结构使用相同的算法来使它们的组成表达式匹配并选择一种结果数据类型。

UNIONCASE和相关结构的类型决定

  1. 如果所有的输入为相同类型,并且不是unknown,那么就决定是该类型。

  2. 如果任何输入是一种域类型,在所有后续步骤中都把它当做该域的基类型。 [12]

  3. 如果所有的输入为unknown类型,则决定为text(字符串分类的首选类型)类型。否则,为了剩余规则,unknown输入会被忽略。

  4. 如果非未知输入不全是相同的类型分类,则失败。

  5. 如果有的话,选择第一个在其分类中作为首选类型的非未知输入类型。

  6. 否则,选择最后的非未知输入类型,它允许所有在前面的非未知输入被隐式地转换为它(总有这样的一种类型,因为至少在列表中的第一个类型必须满足这个条件)。

  7. 转换所有的输入为选定的类型。如果没有一个从给定输入到选定类型的转换将会失败。

下面是一些例子。

例 10.10. 联合中未指定类型的类型决定


SELECT text 'a' AS "text" UNION SELECT 'b';

 text
------
 a
 b
(2 rows)

这里,未知类型文字'b'将被决定为类型text


例 10.11. 简单联合中的类型决定


SELECT 1.2 AS "numeric" UNION SELECT 1;

 numeric
---------
       1
     1.2
(2 rows)

文字1.2numeric类型,且integer1可以被隐式地造型为numeric,因此使用numeric类型。


例 10.12. 可换位联合中的类型决定


SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);

 real
------
    1
  2.2
(2 rows)

这里,由于类型real被能被隐式地造型为integer,而integer可以被隐式地造型为real,联合结果类型被决定为real


例 10.13. 嵌套合并中的类型决定


SELECT NULL UNION SELECT NULL UNION SELECT 1;

ERROR:  UNION types text and integer cannot be matched

这个失败发生的原因是把多个UNION当作是成对操作的嵌套,也就是说上面的输入等同于:

(SELECT NULL UNION SELECT NULL) UNION SELECT 1;

根据上面给定的规则,内层的UNION被确定为类型text。然后外层的UNION的输入是类型textinteger,这就导致了上面看到的错误。通过确保最左边的UNION至少有一个输入类型为想要的结果类型,就可以修正这个问题。

INTERSECTEXCEPT操作也被当作成对操作。不过,这一节中描述的其他结构会在一个决定步骤中考虑所有的输入。



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

评论