基于PostgreSQL的RSQL如何合并含2个共享列的两张表
PostgreSQL 合并列数不同的表(自动填充NULL)
针对你需要合并table1和table2,且自动为table2缺失的列填充NULL的需求,不用手动写大量NULL AS 列名,推荐以下两种简洁方案:
方案1:利用JSONB自动匹配列(无需额外扩展)
PostgreSQL 9.4及以上版本支持,通过JSONB类型转换自动匹配列名,缺失列自动填充NULL:
SELECT * FROM table1 UNION ALL SELECT (jsonb_populate_record(NULL::table1, to_jsonb(table2))).* FROM table2;
原理
to_jsonb(table2)将table2的行转为JSONB对象,jsonb_populate_record(NULL::table1, ...)会把JSONB中的键值对填充到table1的行结构中,未匹配的字段自动设为NULL,最后通过.*展开所有列。
方案2:使用HStore扩展(需先安装)
如果习惯使用HStore类型,可借助其行更新功能实现:
- 先安装HStore扩展(仅需执行一次):
CREATE EXTENSION IF NOT EXISTS hstore;
- 执行合并查询:
SELECT * FROM table1 UNION ALL SELECT (ROW(NULL::table1) #= hstore(table2)).* FROM table2;
原理
ROW(NULL::table1)创建一个所有字段为NULL的table1行,hstore(table2)将table2转为HStore键值对,#=运算符用HStore中的值替换行中对应字段,最后展开所有列。
这两种方案都无需手动指定任何缺失列,即使table1列数再多,代码也无需修改,完美解决冗余问题。
内容的提问来源于stack exchange,提问作者Dawid_K
相关产品推荐
相关产品推荐

