9.3 9.4 9.5 9.6 10 11 12 13
阿里云PostgreSQL 问题报告 纠错本页面

10.5. UNION, CASE 和相关构造

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

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

  1. 如果所有输入都是相同的类型,并且不是unknown类型,那么解析成这种类型。

  2. 如果任意输入是域类型,那么在所有随后的步骤中都将其看做是域的基本类型。 [1]

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

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

  5. 如果有,则选取第一个属于该范畴中首选类型的非 unknown 输入类型。

  6. 否则,选择最后一个允许所有前面的非unknown输入隐式转换为它的非unknown输入类型。 (总是有这么一种类型,因为至少列表上的第一种类型必须适合这种情况。)

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

下面是一些例子。

例 10-9. Union中的待定类型解析

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

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

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

例 10-10. 简单Union中的类型解析

SELECT 1.2 AS "numeric" UNION SELECT 1;

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

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

例 10-11. 转置Union中的类型解析

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

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

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

备注

[1]

对于操作符和函数,有点像是对待域输入,这个行为允许域类型通过 UNION或相似的构造保存,只要用户小心的保证所有输入隐式或显式的转换为确切的类型。 否则将选择域的基本类型。

<
/BODY >