10.5. UNION, CASE, 和关联构造

SQLUNION结构必须匹配可能不同的类型成为一个单一的结果设置。 该解决算法分别应用到一个关联查询的每个输出列。 INTERSECTEXCEPT结构在同一路径中像UNION一样决定不同的类型。 CASE, ARRAY, VALUES,GREATESTLEAST 结构使用相同的算法来匹配构成的表达式和查询一个结果数据类型。

UNION, CASE,和相关构造的类型分析

  1. 如果所有的输入为相同格式,并且是未知类型,那么解决该类型。 否则,用它们的底层基本类型取代在列表中的任何域类型。

  2. 如果所有的输入为unknown类型,决定作为text(字符分类的优先格式)类型。 否则,未知输入是被忽略的。

  3. 如果非未知输入不为所有的相同类型分类,那么将失败。

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

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

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

下面是一些例子。

Example 10-7. 在一个关联中使用规定中的类型的类型解析

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

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

这里,未知类型文字'b'将被作为text类型来处理。

Example 10-8. 在一个简单关联中的类型解析

SELECT 1.2 AS "numeric" UNION SELECT 1;

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

文字1.2numeric类型,且integer1 可以隐含地转换为numeric,因此使用那种类型。

Example 10-9. 在一个可换位关联中的类型解析

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

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

这里,因为real类型不能隐含地转换为integer,但是integer 能隐含地转换为real,所以关联结果类型将作为real