10.5. UNION,CASE 和相关构造

SQL UNION构造必须匹配可能不同的类型才能成为单个结果集。解析算法分别应用于联合查询的每个输出列。 INTERSECTEXCEPT构造以与UNION相同的方式解析不同的类型。 CASEARRAYVALUESGREATESTLEAST构造使用相同的算法来匹配其组件表达式并选择结果数据类型。

UNIONCASE和相关构造的类型解析

以下是一些示例。

示例 10.10. union 中类型未指定的类型解析

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

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

在这里,未知类型的 Literals'b'将解析为text

示例 10.11. 简单联合中的类型解析

SELECT 1.2 AS "numeric" UNION SELECT 1;

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

Literals1.2的类型为numeric,并且integer1可以隐式转换为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

发生此失败的原因是 PostgreSQL 将多个UNION视为成对操作的嵌套。也就是说,此 Importing 与

(SELECT NULL UNION SELECT NULL) UNION SELECT 1;

根据上面给出的规则,内部UNION被解析为运行类型text。然后,外部UNION具有类型textinteger的 Importing,从而导致观察到的错误。可以通过确保最左边的UNION具有期望结果类型的至少一个 Importing 来解决该问题。

INTERSECTEXCEPT操作同样成对解决。但是,本节中描述的其他构造会在一个解析步骤中考虑所有 Importing。


[11]有点像对运算符和函数的域 Importing 的处理,这种行为允许通过UNION或类似的结构保留域类型,只要用户注意确保所有 Importing 都隐式或显式属于该确切类型。否则,将首选域的基本类型。

上一章 首页 下一章