您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

5.6. UNION CASE 构造

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

UNION CASE 类型解析

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

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

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

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

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

例子

Example 5-7. Union 中的待定类型

tgl=> SELECT text 'a' AS "Text" UNION SELECT 'b';
 Text
------
 a
 b
(2 rows)

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

Example 5-8. 简单 Union 中的类型转换

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

文本 1.2 类型为 double precision , 数值表的优选类型,因此使用这个类型.

Example 5-9. 转换的 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 就是这种类型), 并最后落到选用第一个候选项的规则上. 这个例子证明了优选类型机制并不象我们想象得那样编码了足够的信息. 以后的 PostgreSQL 版本可能支持一个更通用的 类型优选的语法.