2017-04-20 80 views
0

我正在寻找一种方法来使用键数组从JSONB对象中采集值。这是我的JSON:选择性地从JSONB列中采集基于数组的键和值

{ 
    "Foo1": 1, 
    "Foo2": 2, 
    "Foo3": 3, 
    "Foo3": 4 
} 

我有一个名为“@Fields”的变量,它的类型是TEXT []。该数组包含我想从对象中摘取的键的名称。 {'Foo1','Foo2'}。结果应该是:

{ 
    "Foo1": 1, 
    "Foo2": 2 
} 

我用JSONB_EXTRACT_PATH(“数据” :: jsonb,“@Fields”),然而它似乎函数需要传递的路径作为单个参数而我想给它的阵列不知何故。下面是它在我的查询中的外观:

SELECT 
    "UserID", 
    (
    CASE 
     WHEN ARRAY_LENGTH("@Fields", 1) = 0 THEN "Data" 
     ELSE JSONB_EXTRACT_PATH("Data", "@Fields") 
    END 
) AS "Data" 
FROM 
    UserMeta 

我怀疑我必须使用JSON_EACH或类似的东西?

回答

2

您只能用- operator逐个删除密钥。对于一切,你需要一个子选择,在那里你提取每个键值对,它们进行过滤(这里来你的逻辑;它可以是任何东西BTW),然后汇总值加在一起:

(select jsonb_object_agg(key, value) 
from jsonb_each(data) 
where key = any(keys_should_stay)) sub_select 

例如,在上下文中使用: http://rextester.com/OANQ93761

编辑:如果你想具体含义为空数组(即保留所有的按键),使用此谓词来代替:

where key = any(keys_should_stay) 
or  cardinality(keys_should_stay) = 0 
+0

真棒,谢谢! – ddibiase