sql - 关于嵌套/递归元素的 Postgres JSONB 查询

标签 sql json postgresql

我有一个用 JSON 表示的嵌套和层次结构,例如:

{
   "id":1,
   "children": [
      { "id":2 },
      { "id": 3, "children": [
         { "id": 4 }
         ]
      }
   ]
}

postgres 是否可以回答记录是否在文档的任何部分包含 "id": 4 的查询?

如果是,版本 9.4 中添加的 JSONB 索引是否支持此类查询?

最佳答案

更新:感谢 reddit 上的 therealgaxbo,我们从我的原始代码开始,开发了一些更简洁的东西:

with recursive deconstruct (jsonlevel) as(
    values ('{"id":1,"children":[{"id":2},{"id":3,"children":[{"id":4}]}]}'::json)

    union all

    select 
        case left(jsonlevel::text, 1)
            when '{' then (json_each(jsonlevel)).value
            when '[' then json_array_elements(jsonlevel)
        end as jsonlevel
    from
        deconstruct
    where
        left(jsonlevel::text, 1) in ('{', '[')
)
select * from deconstruct where case when left(jsonlevel::text, 1) = '{' then jsonlevel->>'id' = '4' else false end;

我的原始回复如下:

我疯狂地尝试,最后想出了这样的东西:

with recursive ret(jsondata) as
(select row_to_json(col)::text jsondata from 
json_each('{
   "id":1,
   "children": [
      { "id":2 },
      { "id": 3, "children": [
         { "id": 4 }
         ]
      }
   ]
}'::json) col
union 
select case when left(jsondata::text,1)='[' then row_to_json(json_each(json_array_elements(jsondata)))::text
when left((jsondata->>'value'),2)='{}' then null::text
when left((jsondata->>'value')::text,1)='[' then row_to_json(json_each(json_array_elements(jsondata->'value')))::text
else  ('{"key":'||(jsondata->'key')||', "value":'||(jsondata->'value')||'}')::json::text end jsondata 
from (
select row_to_json(json_each(ret.jsondata::json)) jsondata
from ret) xyz

)
select max(1) from ret
where jsondata::json->>'key'='id' 
and jsondata::json->>'value'='1'

关于sql - 关于嵌套/递归元素的 Postgres JSONB 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27740157/

相关文章:

sql - 如何将两个表合并在一起,选择具有较高值的​​列,而无法使用 MERGE 语句?

mysql - 模拟 row_number() 的此 mysql 查询的 MSSQL 等效项

javascript - 从 json 数组转换为 json 对象无法正常工作

python - 将巨大的(95Mb)JSON 数组拆分成更小的 block ?

javascript - 无法理解如何实现 Google Sheets API

arrays - 存储在 jsonb 中的数组的 Postgres 总和

SQL JSON - 如何修改 Json 数据中存在的 bool 值

mysql - SQL : get all users in many specific group

ruby-on-rails - 数据库唯一性约束不会阻止通过关联创建重复记录

sql - 每周总计唯一序列号