2016-01-09 60 views
1
的設置工會

我希望它是簡單的做到以下幾點:包含表單PostgreSQL的jsonb名單

{ 
    'a':"hello", 
    'b':['jim','bob','kate'] 
} 

我希望能夠得到所有的「B」領域的jsonb 鑑於行從一個表(如選擇jsondata - >'b'from mytable),然後形成一個列表,其中包含至少出現在一個'b'字段中的所有字符串。 (基本上是一套工會)。

我該怎麼做?或者我最好使用python腳本來提取'b'條目,在那裏執行set-union,然後將它存儲回數據庫的其他地方?

回答

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'
  • jsonb_array_elements()功能擴展JSON數組到一組JSON值的獲取列表。
  • trim()函數中修剪"部分中的元素。
  • 修剪後使用array()函數再次轉換爲數組。
  • 使用unnest()函數將其解開可以獲得明顯的價值。
  • 最後用array_agg()來形成預期的結果。