UNION, CASE 和相关构造#

SQL UNION 构造必须把那些可能不太相似的类型匹配起来成为一个结果集。解析算法分别应用于联合查询的每个输出字段。INTERSECT和EXCEPT 构造对不相同的类型使用和 UNION相同的算法进行解析。CASE, ARRAY和 VALUES构造也使用同样的算法匹配它的部件表达式并且选择一个结果数据类型。

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

1. 如果所有输入都是unknown类型则解析成text类型 (字符串类型范畴的首选类型)。否则,忽略unknown输入。

2. 如果非 unknown 输入不属于同一个类型范畴,失败。

3. 选取第一个属于该范畴中首选类型的非 unknown 输入类型或允许所有的非unknown 输入隐式地转换成它。

  1. 把所有输入转换为所选的类型。

下面是一些例子。

例.Union中的待定类型解析

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

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

这里,unknown 类型文本’b’将被解析成text类型。

例.简单Union中的类型解析

SELECT 1.2 AS "numeric" UNION SELECT 1;

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

文本1.2的类型为numeric,而且integer类型的1 可以隐含地转换为numeric,因此使用这个类型。

例. 转置Union中的类型解析

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

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

这里,因为类型real不能被隐含转换成integer,但是integer 可以隐含转换成real,那么联合的结果类型将是real。