UNION, CASE 和相关构造

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 10. 类型转换 | 下一页

# 10.5. `UNION`, `CASE` 和相关构造

SQL `UNION` 构造必须把那些可能不太相似的类型匹配起来成为一个结果集。 解析算法分别应用于联合查询的每个输出字段。`INTERSECT`和`EXCEPT` 构造对不相同的类型使用和 `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`或相似的构造保存，只要用户小心的保证所有输入隐式或显式的转换为确切的类型。 否则将选择域的基本类型。

上一页 | 起始页 | 下一页
值存储 | 上一级 | 索引