pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
UNION、CASE和ARRAY结构 #SQL 的UNION结构必须让可能不同的类型彼此匹配,以形成单一结果集。该解析算法会分别应用到联合查询的每个输出列。INTERSECT和EXCEPT结构以与UNION相同的方式解析不同类型。CASE和ARRAY构造使用完全相同的算法来匹配其组成表达式并选择结果数据类型。
UNION、CASE和ARRAY结构的类型解析
如果所有输入都是unknown类型,则解析为text类型(字符串分类的首选类型)。否则,忽略unknown输入。
如果非unknown输入并非全都属于同一类型分类,则失败。
选择第一个满足如下条件的非unknown输入类型:它是该分类中的首选类型,或者所有非unknown输入都可以隐式转换为它。
把所有输入都转换为所选类型。
下面是一些示例。
例 10.7. 未充分指定类型的 UNION 中的类型解析
SELECT text 'a' AS "text" UNION SELECT 'b'; text ------ a b (2 rows)
这里,unknown类型字面量'b'会被解析为text类型。
例 10.8. 简单 UNION 中的类型解析
SELECT 1.2 AS "numeric" UNION SELECT 1;
numeric
---------
1
1.2
(2 rows)
字面量1.2的类型是numeric,而integer值1可以隐式转换为numeric,因此使用该类型。
例 10.9. 次序对调的 UNION 中的类型解析
SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);
real
------
1
2.2
(2 rows)
这里,由于real类型不能隐式转换为integer,而integer可以隐式转换为real,因此UNION结果类型被解析为real。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。