PostgreSQL中整数与JSONB使用UNION ALL报错问题求助
这个错误的核心原因很直白——PostgreSQL 的 UNION ALL 要求合并的两个查询里,对应列的数据类型必须完全一致,你现在一边返回的是 integer 类型,另一边用 -> 运算符提取 JSONB 字段得到的是 jsonb 类型,自然没法匹配。给你两种实用的解决思路,按需选择:
方案1:把JSONB提取的值转成整数(推荐,适合需要数值类型的场景)
用 ->> 运算符代替 ->,它会把 JSON 里的字段值直接提取成文本类型,再转成整数,让两边的类型统一为 integer:
SELECT 10 as price UNION ALL SELECT ('{"price":2}'::jsonb->>'price')::integer as price;
这里的 ->> 负责把 JSONB 对象里的 price 值转为 text,后面的 ::integer 再把 text 转成整数,和第一个查询的类型完美对齐。
方案2:把整数转成JSONB类型(适合需要保留JSON特性的场景)
如果你的业务场景需要统一使用 JSONB 类型,那反过来把第一个查询的整数转成 JSONB 即可:
SELECT 10::jsonb as price UNION ALL SELECT '{"price":2}'::jsonb->'price' as price;
这样两边返回的都是 JSONB 类型,UNION ALL 就能顺利执行了。
顺便提个容易踩坑的小细节:PostgreSQL 里 -> 和 ->> 的区别要记牢——-> 返回 JSONB 类型,->> 返回文本类型,下次用的时候别搞混哦!
内容的提问来源于stack exchange,提问作者Samuel Dauzon
相关产品推荐
相关产品推荐

