繁体   English   中英

Postgres-查询嵌套对象的JSON列值

[英]Postgres - query JSON column value of nested object

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

{
   "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的结果与表iself联接吗?

演示:分贝<>小提琴

第一种方式 :使用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. 如前所述,通过使用@>检查值列中是否包含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.与第一种方法非常相似

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM