Postgres:查询多个jsonb字段

问题描述

一个包含包含jsonb数据的列的表,我想查询具有多个字段的那些数据。 jsonb结构如下:

{
  "https://example.tld/": 
  [
    {
      "content-length": 312,"path": "page.log","redirect": null,"status": 200
    },{
      "content-length": 312,"path": "pages/",...
  ]
}

我想查询状态为200的所有日志文件,所以我做了

SELECT json_data -> 'path' AS path
FROM table
WHERE json_data->'status' = 200 AND json_data->'path' ILIKE '%.log%'

但是,它不起作用。我使用的最接近的变体是将json内容转换为文本并搜索日志,但它会返回整个内容

SELECT *
FROM table
WHERE json_data::text ILIKE '%.log%'

感谢您的帮助!

解决方法

如果我理解正确,则需要JSON中基础数组的路径。如果是这样:

select rs.path
from t cross join
     jsonb_to_recordset(t.json -> 'https://example.tld/') rs(status int,path text)
 where rs.path ilike '%.log%' and rs.status = 200

Here是db 小提琴。

,

假定顶级键名(在这种情况下为[ { "id": "PARAMETER roles","message": "may not be empty" } ] )在表中的每一行之间变化,那么您将无法使用固定路径,而必须使用{{1 }},然后使用https://example.tld/扩展数组元素。

jsonb_each()