代码之家  ›  专栏  ›  技术社区  ›  Karthikeyan KR

如何仅从postgres json中选择特定键

  •  3
  • Karthikeyan KR  · 技术社区  · 7 年前

    我只需要从postgres json中提取特定的键,让我们考虑以下json

    {"aaa":1,"bbb":2,"ccc":3,"ddd":7}
    

    从上面的json中,我需要选择键“bbb”和“ccc”,即

    {"bbb":2,"ccc":3}
    

    我使用了以下查询,但它正在删除密钥

    SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' - 'ddd}'
    

    如何仅选择指定的键?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Vao Tsun    7 年前

    您可以明确指定键,如下所示:

    t=# with c(j) as (SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' - 'ddd}')
    select j,jsonb_build_object('aaa',j->'aaa','bbb',j->'bbb') from c;
                        j                     |  jsonb_build_object
    ------------------------------------------+----------------------
     {"aaa": 1, "bbb": 2, "ccc": 3, "ddd": 7} | {"aaa": 1, "bbb": 2}
    (1 row)
    
        2
  •  2
  •   Haleemur Ali    7 年前
    WITH data AS (
      SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' col
    )
    SELECT kv.*
    FROM data,
    LATERAL (
      SELECT jsonb_object(ARRAY_AGG(keyval.key::TEXT), ARRAY_AGG(keyval.value::TEXT)) 
      FROM jsonb_each(col) keyval
      WHERE keyval.key IN ('aaa', 'bbb', 'ccc')) kv
    

    解决方案通过扩展 JSONB (或 JSON )对象,筛选键,聚合筛选的键(&P);创建最终 JSONB公司 (或 JSON )对象。

    但是,此解决方案不保留null,即如果 data 吵架了 col 有价值 jsonb '{"aaa":1,"bbb":2, "ddd":7}' ,则上述解决方案将返回 jsonb '{"aaa":1,"bbb":2}'

    要保留空值,可以使用以下形式。

    WITH data AS (
      SELECT jsonb '{"aaa":1,"bbb":2,"ccc":3,"ddd":7}' col
    ), keys(k) AS (
      VALUES ('aaa'), ('bbb'), ('ccc')
    )
    SELECT col, jsonb_object(ARRAY_AGG(k), ARRAY_AGG(col->>k))
    FROM data, keys 
    GROUP BY 1