Postgresql jsonb set-union of lists

时间:2016-01-09 23:33:35

标签: arrays postgresql jsonb

我希望能做到以下几点是直截了当的: 给定包含

形式的jsonb的行
{
  'a':"hello",
  'b':['jim','bob','kate']
}

我希望能够从表中获取所有'b'字段(如在mytable中选择jsondata->'b'),然后形成一个列表,该列表包含至少出现在一个中的所有字符串' b'场地。 (基本上是一个联盟。)

我该怎么做?或者我最好使用python脚本提取'b'条目,在那里进行set-union,然后将其存储回其他地方的数据库中?

1 个答案:

答案 0 :(得分:0)

这为您提供了json列表'b'中的联合元素集。

SELECT array_agg(a order by a) 
FROM (SELECT DISTINCT unnest(txt_arr) AS a FROM
     (SELECT  ARRAY(SELECT trim(elem::text, '"')
                    FROM   jsonb_array_elements(jsondata->'b') elem) AS txt_arr
      FROM   jtest1)y)z;

查询说明:

  • 从b获取jsondata->'b'
  • 的列表
  • 将JSON数组扩展为jsonb_array_elements()函数的一组JSON值。
  • 修剪" function。
  • 中元素的trim()部分
  • 修剪后使用array()功能再次转换为数组。
  • 使用unnest()函数取消它,获取不同的值。
  • 最后array_agg()用于形成预期结果。