【问题标题】:Postgres - query JSON column value of nested objectPostgres - 查询嵌套对象的 JSON 列值
【发布时间】:2019-09-13 13:54:02
【问题描述】:

我正在为我的表的 JSONB 列(名为 fields)使用以下架构。这些字段条目有几个。

{
   "FIELD_NAME": {
      "value" : "FIELD_VALUE",
      "meta": {
         "indexable": true
      }
   }
}

我需要找到包含这个对象的所有字段

 "meta": {
    "indexable": true
 }

这是在 where 子句中使用 json_object_keys 的幼稚尝试,它不起作用,但说明了我正在尝试做的事情。

with entry(fields) as (values('{
  "login": {
    "value": "fred",
    "meta": {
      "indexable": true
    }
  },
  "password_hash": {
    "value": "88a3d1c7463d428f0c44fb22e2d9dc06732d1a4517abb57e2b8f734ce4ef2010",
    "meta": {
      "indexable": false
    }
  }
}'::jsonb))
select * from entry where fields->jsonb_object_keys(fields) @> '{"meta": {"indexable": "true"}}'::jsonb;

如何查询嵌套对象的值?我可以以某种方式将json_object_keys 的结果与表本身连接起来吗?

【问题讨论】:

  • 元似乎出现在不同的层面。是这样吗?
  • @S-Man 不,这是一个错误。感谢您指出。固定。
  • 你想要整个对象“{login: {...}}”还是只想要键“login”
  • @S-Man 我需要整个对象。

标签: sql postgresql jsonb


【解决方案1】:

demo:db<>fiddle

第一种方式:使用jsonb_each()

SELECT
    jsonb_build_object(elem.key, elem.value)        -- 3
FROM
    entry,
    jsonb_each(fields) as elem                      -- 1
WHERE
    elem.value @> '{"meta": {"indexable": true}}'   -- 2
  1. 将所有子对象扩展为每个“字段”一行。这将创建 2 列:keyvalue(在您的情况下为 login{"meta": {"indexable": true}, "value": "fred"}
  2. 使用您已经提到的@&gt; 检查包含meta 对象的值列来过滤记录
  3. 重新创建 JSON 对象(结合 key/value 列)

第二种方式:使用jsonb_object_keys()

SELECT
    jsonb_build_object(keys, fields -> keys)            -- 3
FROM
    entry,
    jsonb_object_keys(fields) as keys                   -- 1
WHERE 
    fields -> keys @> '{"meta": {"indexable": true}}'   -- 2
  1. 像您一样查找所有密钥
  2. 和3.和第一种方式很相似

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2017-01-28
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多