You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中JsonB列多键数据转多行/合并行的SQL实现求助

PostgreSQL JSONB列转换为两种格式的SQL实现

假设你的表名为your_table,jsonb列名为jsonb_column,且该列存储的是标准JSON数组(示例中ID=1的多对象数据需以数组形式存储,如[{"code1": "AB", "code2": "BC", "code3": "CD"}, {"code1": "DE", "code2": "EF"}],PostgreSQL的jsonb列无法直接存储多个独立JSON对象)。


格式一:拆分为多行

使用jsonb_array_elements将JSON数组展开为单行对象,提取对应字段值:

SELECT 
    t.id,
    j->>'code1' AS "Code 1",
    j->>'code2' AS "Code 2",
    j->>'code3' AS "Code 3"
FROM 
    your_table t,
    jsonb_array_elements(t.jsonb_column) j;

缺失的字段(如ID=1第二个对象的code3)会返回NULL,显示为空值。


格式二:同ID下字段值用~拼接

通过分组+string_agg函数聚合同ID的同名字段值:

SELECT 
    t.id,
    string_agg(j->>'code1', '~') AS "Code 1",
    string_agg(j->>'code2', '~') AS "Code 2",
    string_agg(j->>'code3', '~') AS "Code 3"
FROM 
    your_table t,
    jsonb_array_elements(t.jsonb_column) j
GROUP BY 
    t.id;

单个值的字段(如ID=1的code3)会直接显示原值,无需拼接。


兼容非数组格式的特殊处理

如果你的jsonb列存在单个JSON对象(而非数组)的情况,可先统一转换为数组再执行上述查询:

WITH formatted_data AS (
    SELECT 
        id,
        CASE 
            WHEN jsonb_typeof(jsonb_column) = 'object' THEN jsonb_build_array(jsonb_column)
            ELSE jsonb_column
        END AS jsonb_array
    FROM your_table
)
-- 此处替换为格式一或格式二的查询语句
SELECT 
    id,
    j->>'code1' AS "Code 1",
    j->>'code2' AS "Code 2",
    j->>'code3' AS "Code 3"
FROM formatted_data, jsonb_array_elements(jsonb_array) j;

内容的提问来源于stack exchange,提问作者Luis Enrique Garduno Morales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:35:27