我正在寻找一种使用键数组从JSONB对象中提取值的方法。这是我的JSON:
{
"Foo1": 1,
"Foo2": 2,
"Foo3": 3,
"Foo3": 4
}
我有一个名为“@Fields”的变量,它的类型为TEXT []。该数组包含我想从对象中提取的键的名称,即。 {'Foo1','Foo2'}。结果应该是:
{
"Foo1": 1,
"Foo2": 2
}
我正在使用JSONB_EXTRACT_PATH(“Data”:: jsonb,“@ Field”)但是看起来这个函数需要将路径作为单独的参数传递,而我想以某种方式给它一个数组。以下是我在查询中的显示方式:
SELECT
"UserID",
(
CASE
WHEN ARRAY_LENGTH("@Fields", 1) = 0 THEN "Data"
ELSE JSONB_EXTRACT_PATH("Data", "@Fields")
END
) AS "Data"
FROM
UserMeta
我怀疑我必须使用JSON_EACH或类似的东西吗?
答案 0 :(得分: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