根据JSONB列中的数组选择性地提取键和值

时间:2017-04-20 15:16:40

标签: sql json postgresql

我正在寻找一种使用键数组从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或类似的东西吗?

1 个答案:

答案 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