5.5. UNION 和 CASE 构造

UNION 和 CASE 构造必须把那些可能不太相似的类型匹配起来成为一个结果集. 解析算法分别应用于 UNION 的每个输出字段.CASE 使用相同的算法 匹配它的结果表达式.

UNION 和 CASE 类型解析

  1. 如果所有输入都是类型 unknown,解析成类型text (字串类型的优选类型).否则,在选择类型的时候忽略 unknown 输入.

  2. 如果非 unknown 输入不是全部属于一个类型表,抛出一个错误.

  3. 如果一个或更多非 unknown 输入是该类型表里的优选类型,解析为该类型.

  4. 否则,解析成第一个非 unknown 输入的类型.

  5. 把所有输入转换成所选类型.

5.5.1. 例子

5.5.1.1. 待定类型

tgl=> SELECT text 'a' AS "Text" UNION SELECT 'b';
 Text
------
 a
 b
(2 rows)
这里,unknown 类型文本 'b' 将被解析成类型 text.

5.5.1.2. 简单的 UNION

tgl=> SELECT 1.2 AS "Double" UNION SELECT 1;
 Double
--------
      1
    1.2
(2 rows)

5.5.1.3. 转换的 UNION

这里 union 的的输出类型将被强制与 union 的第一个/顶端的语句的类型相同:

tgl=> SELECT 1 AS "All integers"
tgl-> UNION SELECT CAST('2.2' AS REAL);
 All integers
--------------
            1
            2
(2 rows)

因为 REAL 不是优选类型,分析器觉得没有理由选它而不用 INTEGER(因为 1 就是这种类型), 并最后落到选用第一个候选项的规则上. 这个例子证明了优选类型机制并不象我们想象得那样编码了足够的信息. 以后的Postgres 版本可能支持一个更通用的 类型优选的语法.