如何在JSONB类型列中重新排序数组

时间:2016-08-04 16:16:09

标签: json postgresql jsonb

在PostgreSQL表中,一个JSONB类型的列,其中存储的值是一个数组[3,6,78,1]

我该如何重新排序[1,3,6,78]

1 个答案:

答案 0 :(得分:4)

使用jsonb_array_elements()取消数组,并使用jsonb_agg()聚合其已排序的元素:

with the_data(val) as (values ('[3,6,78,1]'::jsonb))

select jsonb_agg(elem order by elem) as val
from the_data
cross join lateral jsonb_array_elements(val) as arr(elem);

      val      
---------------
 [1, 3, 6, 78]
(1 row)

您可以在自定义函数中使用该查询,该函数在更复杂的查询中非常方便:

create or replace function jsonb_sort_array(jsonb)
returns jsonb language sql immutable
as $$
    select jsonb_agg(elem order by elem)
    from jsonb_array_elements($1) as arr(elem)
$$;

with the_data(val) as (values ('[3,6,78,1]'::jsonb))

select jsonb_sort_array(val) as val
from the_data;

      val      
---------------
 [1, 3, 6, 78]
(1 row)