【问题标题】:PostgreSQL query that finds and/or deletes certain elements from JSON array field从 JSON 数组字段中查找和/或删除某些元素的 PostgreSQL 查询
【发布时间】:2020-12-27 12:35:04
【问题描述】:

我们有一个带有jsonb[] 列的表,其中包含一个带有各种键的JSON 对象数组。数据库是 PostgreSQL (v9.6)

----------------------------------------------------
| id | data (jsonb[])                              |
----------------------------------------------------
|  1 | [{a:1, B:2, c:3}, {a:4, c:5}, {a:6, B:7}]   |
|  2 | [{a:8}, {B:9, c:10}]                        |
|  3 | [{a:11}]                                    |
----------------------------------------------------

我们想删除或设置为空 B:

的所有值

所以,我们想得到

---------------------------------------------------------------
| id | data (jsonb[])                                         |
---------------------------------------------------------------
|  1 | [{a:1, B:null/"", c:3}, {a:4, c:5}, {a:6, B:null/""}]  |
|  2 | [{a:8}, {B:null/"", c:10}]                             |
|  3 | [{a:11}]                                               |
---------------------------------------------------------------

------------------------------------------
| id | data (jsonb[])                    |
------------------------------------------
|  1 | [{a:1, c:3}, {a:4, c:5}, {a:6}]   |
|  2 | [{a:8}, {c:10}]                   |
|  3 | [{a:11}]                          |
------------------------------------------

如果没有简单的方法来更新 B 字段,我们很乐意找到一种方法来获取所有具有 B 的记录:在数据字段中,在这种情况下,我们可以加载所有记录并在外部处理它们数据库。

到目前为止,我们还没有找到方法,甚至找不到所有具有 B: 字段的记录。

任何想法都会很棒,谢谢!

【问题讨论】:

    标签: sql arrays postgresql jsonb postgresql-9.6


    【解决方案1】:

    您可以通过UNNEST Array 实现它 --> Subtract Element --> Aggregate 方法

    如果你想删除元素,那么试试这个:

    select 
    id,
    jsonb_agg(y-'B') 
    from test cross join lateral unnest(data) x(y)
    group by id
    

    DEMO

    如果你想设置元素 NULL 的值,那么试试这个:

    select 
    id, 
    jsonb_agg(jsonb_set(y,'{B}','null',false)) 
    from test cross join lateral unnest(data) x(y)
    group by id
    
    

    DEMO

    根据评论编辑:

    with cte as (
    select 
    id,
    array_agg(y-'B') "data"
    from test cross join lateral unnest(data) x(y)
    group by id
    )
    
    update test t1 set data = t2.data from cte t2 where t1.id=t2.id;
    

    FIDDLE

    【讨论】:

    • 谢谢,这很好,但它只是从选择中删除了 B: 键。我想从数据库中删除它...
    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2020-10-21
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多