【问题标题】:Postgres: concatenate JSONB values across rows?Postgres:跨行连接JSONB值?
【发布时间】:2017-01-23 13:01:40
【问题描述】:

我正在掌握 Postgres >= 9.5 中的 JSONB 功能(并且喜欢它),但遇到了一个绊脚石。我已经了解了连接 JSON 字段的能力,因此 '{"a":1}' || '{"b":2}' 创建了 {"a":1,"b":2},但我想在多行中的同一字段中执行此操作。例如:

select row_concat_??(data) from table where field = 'value'

我发现了 jsonb_object_agg 函数,这听起来像是我想要的,除了 docs 显示它接受多个参数,而我只有一个。

任何想法我会如何做到这一点? jsonb_agg 成功创建了一个数组,感觉真的很接近了。

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:

    在对 Postgres 中的自定义聚合进行了一些挖掘之后,我得到了以下信息:

    DROP AGGREGATE IF EXISTS jsonb_merge(jsonb);
    
    CREATE AGGREGATE jsonb_merge(jsonb) (
        SFUNC = jsonb_concat(jsonb, jsonb),
        STYPE = jsonb,
        INITCOND = '{}'
    )
    

    然后可以用作:

    SELECT group_id, jsonb_merge(data) FROM table GROUP BY group_id
    

    【讨论】:

    • 你不需要创建函数,使用jsonb_concat(jsonb, jsonb)
    • 哇哦,你是对的。容易多了。编辑以反映这一点,谢谢@klin!
    【解决方案2】:

    使用jsonb_each():

    with data(js) as (
        values
        ('{"a": 1}'::jsonb),
        ('{"b": 2}')
    )
    select jsonb_object_agg(key, value)
    from data
    cross join lateral jsonb_each(js);
    
     jsonb_object_agg 
    ------------------
     {"a": 1, "b": 2}
    (1 row) 
    

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多