首页 > 数据库 > > 类型转换-UNION,CASE和相关构造
SQL UNION构造必须把那些可能不太相似的类型匹配起来成为一个结果集。解析算法分别应用于联合查询的每个输出字段。INTERSECT和EXCEPT构造对不相同的类型使用和UNION相同的算法进行解析。CASE、ARRAY、VALUES、GREATEST和LEAST构造也使用同样的算法匹配它的部件表达式并且选择一个结果数据类型。
说明:系统表pg_type中typcategory表示数据类型范畴, typispreferred表示是否是typcategory分类中的首选类型。
示例1:Union中的待定类型解析。这里,unknown类型文本'b'将被解析成text类型。
SELECT text 'a' AS "text" UNION SELECT 'b';
text
------
a
b
(2 rows)
示例2:简单Union中的类型解析。文本1.2的类型为numeric,而且integer类型的1可以隐含地转换为numeric,因此使用这个类型。
SELECT 1.2 AS "numeric" UNION SELECT 1;
numeric
---------
1
1.2
(2 rows)
示例3:转置Union中的类型解析。这里,因为类型real不能被隐含转换成integer,但是integer可以隐含转换成real,那么联合的结果类型将是real。
SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);
real
------
1
2.2
(2 rows)
示例4:TD模式下,coalesce参数输入int和varchar类型,那么解析成varchar类型。ORA模式下会报错。
--在oracle模式下,创建oracle兼容模式的数据库oracle_1。
CREATE DATABASE oracle_1 dbcompatibility = 'ORA';
--切换数据库为oracle_1。
\c oracle_1
--创建表t1。
oracle_1=# CREATE TABLE t1(a int, b varchar(10));
--查看coalesce参数输入int和varchar类型的查询语句的执行计划。
oracle_1=# EXPLAIN SELECT coalesce(a, b) FROM t1;
ERROR: COALESCE types integer and character varying cannot be matched
CONTEXT: referenced column: coalesce
--删除表。
oracle_1=# DROP TABLE t1;
--切换数据库为postgres。
oracle_1=# \c postgres
--在TD模式下,创建TD兼容模式的数据库td_1。
CREATE DATABASE td_1 dbcompatibility = 'TD';
--切换数据库为td_1。
\c td_1
--创建表t2。
td_1=# CREATE TABLE t2(a int, b varchar(10));
--查看coalesce参数输入int和varchar类型的查询语句的执行计划。
td_1=# EXPLAIN VERBOSE select coalesce(a, b) from t2;
QUERY PLAN
---------------------------------------------------------------------------------------
Data Node Scan (cost=0.00..0.00 rows=0 width=0)
Output: (COALESCE((t1.a)::character varying, t1.b))
Node/s: All datanodes
Remote query: SELECT COALESCE(a::character varying, b) AS "coalesce" FROM public.t1
(4 rows)
--删除表。
td_1=# DROP TABLE t2;
--切换数据库为postgres。
td_1=# \c postgres
--删除Oracle和TD模式的数据库。
DROP DATABASE oracle_1;
DROP DATABASE td_1;来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3160681/ ,如需转载,请注明出处,否则将追究法律责任。