PostgreSQL 9迁移至GCP Cloud SQL 12后UNION类型匹配错误求助
问题原因与修复方案
核心原因
PostgreSQL 12对UNION ALL的列类型一致性检查比PostgreSQL 9更严格——哪怕其中一个查询分支没有返回任何数据,数据库仍会预先验证两个分支的对应列类型是否兼容。而PostgreSQL 9在分支无数据时会放松这个检查,所以之前能正常运行。
你的报错UNION types integer and text cannot be matched说明t1和t2对应列(c1/c2/c3中的某一列)的类型不一致,比如t1.c1是integer,但t2.c1是text。
修复步骤
确认列类型差异
先分别查询两张表的列类型,定位不匹配的字段:-- 查看t1的列类型 SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 't1'; -- 查看t2的列类型 SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 't2';显式转换类型,保证分支列类型一致
在t2的子查询中,把不匹配的列转换为和t1一致的类型。比如如果t1.c1是integer,t2.c1是text,就用::integer做类型转换:Select c1, c2, c3 From table t1 Union all Select x_.* From (Select c1::integer, c2::varchar, c3::integer From table t2) as x_ -- 类型与t1对应列保持一致 Inner Join t3 as t on t.c33 = x_.c3 Where c2 in ('a', 'b', 'd')长期修复:统一表结构
如果业务允许,建议直接修改t2的列类型,让它和t1保持一致,避免后续再出现类似类型不兼容问题:-- 示例:将t2.c1从text类型修改为integer类型 ALTER TABLE t2 ALTER COLUMN c1 TYPE integer USING c1::integer;
内容的提问来源于stack exchange,提问作者user3737851
相关产品推荐
相关产品推荐

