【问题标题】:Selectively pluck keys and values based on array from JSONB column基于 JSONB 列中的数组有选择地提取键和值
【发布时间】:2017-04-20 15:16:40
【问题描述】:

我正在寻找一种使用键数组从 JSONB 对象中提取值的方法。这是我的 JSON:

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

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

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

我使用的是 JSONB_EXTRACT_PATH("Data"::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 或类似的东西?

【问题讨论】:

    标签: sql json postgresql


    【解决方案1】:

    您只能使用- operator 一个接一个地删除密钥。对于其他所有内容,您将需要一个子选择,在其中提取每个键值对,过滤它们(这是您的逻辑;可以是任何东西),然后将值聚合在一起:

    (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
    

    【讨论】:

      猜你喜欢
      • 2017-02-20
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多