【问题标题】:How to delete JSON Object from JSON array in Postgres?如何从 Postgres 中的 JSON 数组中删除 JSON 对象?
【发布时间】:2021-12-23 00:59:01
【问题描述】:

我是 Postgres 的新手。我想从 JSON 数组中删除 JSON 对象。

我有一个表,我正在使用 jsonb 列存储 JSON 数组,如下所示。

[
  {
    "id": "c75e7a-001e-4d64-9613-62f666d42103",
    "name": "Product1"
  },
  {
    "id": "c75e7a-001e-4d64-9613-62f666d42103",
    "name": null
  },
  {
    "id": "c75e7a-001e-4d64-9613-62f666d42103",
    "name": "Product2"
  },
  {
    "id": "c75e7a-001e-4d64-9613-62f666d42103",
    "name": null
  }
]

我想从名称键中包含空值的数组中删除 JSON 对象。

去掉答案后应该是这样的

[
  {
    "id": "c75e7a-001e-4d64-9613-62f666d42103",
    "name": "Product1"
  },
  {
    "id": "c75e7a-001e-4d64-9613-62f666d42103",
    "name": "Product2"
  }
]

任何人,请帮我编写 SQL 查询,

我知道如何从包含空值的表中获取所有记录。

SELECT * 
  FROM table_name 
 WHERE jsonb_col_name @>CAST('[{"name": null}]' AS JSONB);

但我不知道如何进行删除查询,请帮助我。 我如何使用查询来做到这一点?

【问题讨论】:

    标签: sql postgresql jsonb


    【解决方案1】:

    使用jsonb_array_elements 取消嵌套数组,使用FILTER 排除null 值并再次聚合它们,例如

    SELECT 
      jsonb_agg(j) FILTER (WHERE j->>'name' IS NOT NULL)
    FROM table_name t, jsonb_array_elements(jsonb_col) j 
    GROUP BY t.jsonb_col;
    

    演示:db<>fiddle

    【讨论】:

      【解决方案2】:

      您可以使用JSONB_ARRAY_ELEMENTS将数组拆分为子对象后通过j.value ->> 'name' IS NOT NULL过滤掉,然后应用JSONB_AGG以便将其转换回数组,例如

      SELECT JSONB_PRETTY(
                          JSONB_AGG(j)
                         )
        FROM t, 
             JSONB_ARRAY_ELEMENTS(json_data) AS j
       WHERE j.value ->> 'name' IS NOT NULL
       GROUP BY json_data
      

      如果需要更新现有数据,那么您可以考虑使用

      WITH tt AS
      (
      SELECT JSONB_AGG(j) AS new_val,
             json_data            
        FROM t, 
             JSONB_ARRAY_ELEMENTS(json_data) AS j
       WHERE j.value ->> 'name' IS NOT NULL
       GROUP BY json_data
      )
      UPDATE t
         SET json_data = new_val::JSONB
        FROM tt
       WHERE t.json_data = tt.json_data
      

      Demo

      【讨论】:

        【解决方案3】:

        你可以使用json_array_elements:

        select json_agg(i.value) from json_array_elements('[{"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": "Product1"}, {"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": null}, {"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": "Product2"}, {"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": null}]') v 
        where (v.value -> 'name')::text != 'null'
        

        输出:

        [{"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": "Product1"}, {"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": "Product2"}]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-13
          • 2015-07-18
          相关资源
          最近更新 更多