2017-04-18 52 views
1

我有一个表postgres的修改阵列元素

id int | data json 

随着数据:

1 | [1,2,3,2] 
2 | [2,3,4] 

我想修改要删除的行阵列元件(INT)2

预期结果:

1 | [1,3] 
2 | [3,4] 
+0

第二行应该是'[3,4]'? – kennytm

+2

示例数据看起来更像是一个“native”数组,而不是JSON文档。这真的是JSON吗?如果是这样,你为什么要将一个普通的数组放入一个JSON文档中?对于本地数组可以使用'array_remove()' –

+0

这真的是json –

回答

1

As a_horse_with_no_name su在这种情况下,在他的评论中提到了正确的数据类型是int []。但是,可以改变JSON数组为int [],使用array_remove()并将结果转换回JSON:

with my_table(id, data) as (
values 
(1, '[1,2,3,2]'::json), 
(2, '[2,3,4]') 
) 

select id, to_json(array_remove(translate(data::text, '[]', '{}')::int[], 2)) 
from my_table; 

id | to_json 
----+--------- 
    1 | [1,3] 
    2 | [3,4] 
(2 rows)  

另一种可能是用json_array_elements()到UNNEST阵列,消除不需要的元素和聚合结果:

select id, json_agg(elem) 
from (
    select id, elem 
    from my_table, 
    lateral json_array_elements(data) elem 
    where elem::text::int <> 2 
    ) s 
group by 1; 
+0

非常感谢。 第一个示例正常工作。 但速度有多快? =) –

+0

第一个查询应该比第二个查询快,但比int []数据上的类似查询慢得多。 – klin