↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本。 PostgreSQL 7.2 已结束支持。 请参阅 当前版本手册.

5.6. UNION 和 CASE 结构 #

UNION 结构必须把可能不相似的类型匹配起来构成单一结果集。解析算法对联合查询的每个输出列分别应用。INTERSECT 和 EXCEPT 结构用与 UNION 相同的方式解析不相似的类型。CASE 结构也使用同一算法来匹配其组成表达式并选择结果数据类型。

UNION 和 CASE 类型解析

  1. 如果所有输入都是 unknown 类型,就解析为 text 类型(string 类别的首选类型)。否则,在选择类型时忽略 unknown 输入。

  2. 如果非unknown输入并非全都属于同一类型分类,则失败。

  3. 如果一个或多个非 unknown 输入是该类别中的首选类型,就解析为该类型。

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

  5. 把所有输入强制转换为所选类型。

Examples

例 5.7. 联合中未充分指定的类型

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

这里,未知类型的字面量 'b' 会被解析成 text 类型。


例 5.8. 简单联合中的类型转换

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

字面量 1.2 是 double precision 类型,即数值类别中的首选类型,所以使用该类型。


例 5.9. 转置联合中的类型转换

这里 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 的未来版本可能支持更一般的类型偏好概念。


报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.