2017-08-04 254 views
0

的目的我在我的Postgres 9.6数据库具有JSONB柱大致有以下结构访问对象的JSONB阵列阵列

[ 
    { 
    "A": "some value", 
    "B": "another value", 
    "foo": "bar", 
    "x": "y" 
    }, 
    { 
    "B": "abc", 
    "C": "asdf" 
    } 
] 

它始终是对象的数组,数组元素的数目而变化。一些对象键在每个数组元素中,但不是全部。真正的物体有更多的键,有几百个是常见的。

在某些情况下,我需要为每个数组元素获取特定键的值。例如,如果我要访问的键“B”的结果应该是

["another value", "abc"] 

,如果我进入“富”的结果应该是

["bar", null] 

是否有获取所有合理有效的方法SQL查询中特定键的值?它应该独立于数组中对象的数量工作,理想情况下,如果对象中的键数量变得更大,它不应该变慢。

回答

1

可以使用jsonb_array_elements提取每个对象,使用ARRAY_AGG聚集那些你想在一个数组,然后再转换成JSON数组使用array_to_json

WITH j(json) AS (
    VALUES ('[ 
    { 
     "A": "some value", 
     "B": "another value", 
     "foo": "bar", 
     "x": "y" 
    }, 
    { 
     "B": "abc", 
     "C": "asdf" 
    } 
    ]'::jsonb) 
) 
SELECT array_to_json(ARRAY_AGG(elem->'B')) 
FROM j, jsonb_array_elements(json) elem 
; 
     array_to_json 
------------------------- 
["another value","abc"] 
(1 row) 

WITH j(json) AS (
    VALUES ('[ 
    { 
     "A": "some value", 
     "B": "another value", 
     "foo": "bar", 
     "x": "y" 
    }, 
    { 
     "B": "abc", 
     "C": "asdf" 
    } 
    ]'::jsonb) 
) 
SELECT array_to_json(ARRAY_AGG(elem->'foo')) 
FROM j, jsonb_array_elements(json) elem 
; 
array_to_json 
--------------- 
["bar",null] 
(1 row)