PL/pgSQL如何遍历单行内各列并逐列插入t2表
实现方案
直接用PostgreSQL内置的JSON处理函数即可实现,不需要手动逐列编写插入语句,完整代码如下:
DECLARE a t1%ROWTYPE; BEGIN SELECT * INTO a FROM t1 WHERE id=<some_id>; INSERT INTO t2 (column_name, value) SELECT key AS column_name, value FROM jsonb_each(to_jsonb(a)); END;
核心逻辑说明
to_jsonb(a):将ROWTYPE类型的行变量a自动转换为JSONB对象,键为t1表的列名,值为对应列自动转换后的合法JSONB值,和t2表的value字段类型完全匹配。jsonb_each():表函数,会把传入的JSONB对象拆分为多行结果,返回的key对应原JSON的键(即t1的列名),value对应原JSON的值,和t2表字段一一对应,可直接插入。
扩展说明
- 该方案不需要硬编码t1的列名,后续t1表增减字段时代码无需修改,会自动适配所有列。
- 类型转换由数据库自动完成,支持数值、字符串、时间等所有PostgreSQL原生类型到JSONB的转换,不会出现类型不匹配错误。
- 如果需要过滤特定列不插入,直接加WHERE条件即可,例如排除id列:
INSERT INTO t2 (column_name, value) SELECT key AS column_name, value FROM jsonb_each(to_jsonb(a)) WHERE key != 'id';
内容的提问来源于stack exchange,提问作者Prosto_Oleg
相关产品推荐
相关产品推荐

