PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

10.5. UNION、CASE 及相关结构 #

SQL UNION 联合查询必须将来自各个独立分支的可能不同类型的数据行,统一规约合并为一个单一的结果集。推导算法对联合查询的每一个输出列分别独立执行。INTERSECT(交集)与 EXCEPT(差集)在类型推导上与 UNION 完全相同。CASE 条件分支、ARRAY[] 数组构造器、VALUES 列表以及 GREATEST、LEAST 等函数,全部采用完全相同的推导算法来选定统一的公共返回类型。

UNION 与 CASE 类型推导算法

  1. 若所有分支输入的类型完全相同(且不为 unknown),直接以此类型作为最终输出类型。

  2. 若输入包含域类型,将其平铺视为其底层基类型对待。

  3. 若所有输入均为 unknown 占位符,统一解析为 text 类型(字符串类别的首选类型)。否则,在后续规则中忽略这些 unknown 输入。

  4. 若所有非 unknown 的输入并非全部归属于同一个类型类别,类型决议失败并报错。

  5. 选取首个非 unknown 输入的类型作为候选类型,随后自左向右依次考察其他非 unknown 输入:若候选类型可隐式转换为后者而后者不能反向隐式转换,则将后者选为新的候选类型。在整个流程中,一旦选中了某个类别的首选类型(preferred type),立即停止考察并锁定该首选类型。

  6. 将所有输入分支显式或隐式转换为该最终候选类型。若某分支无法转换为该候选类型,查询执行失败。

Example 10.4. 联合查询中简单类型推导

SELECT 1.2 AS "numeric" UNION SELECT 1;

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

字面量 1.2 属于 numeric 类型,而整型数值 1 可以被隐式转换为 numeric,因此最终联合结果集的数据类型被统一决议为 numeric。