簡體   English   中英

Postgres:查詢多個jsonb字段

[英]Postgres: Querying multiple jsonb fields

有一個包含 jsonb 數據的列的表,我想用多個字段查詢這些數據。 jsonb 結構如下所示:

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

我想查詢所有狀態為 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

是一個 db<>fiddle。

假設頂級鍵名(在這種情況下為https://example.tld/ )在表中逐行更改,您將無法使用固定路徑,並且必須使用jsonb_each()擴展 object在使用jsonb_array_elements()擴展數組元素之前。

with indat as ( select 1 as id, '{
  "https://example.tld/":
  [
    {
      "content-length": 312,
      "path": "page.log",
      "redirect": null,
      "status": 200
    },
    {
      "content-length": 312,
      "path": "pages/",
      "redirect": null,
      "status": 200
    }
  ]
}'::jsonb as json_data
)
select i.id, j.key, e.element
  from indat i
 cross join lateral jsonb_each(json_data) as j(key, value)
 cross join lateral jsonb_array_elements(j.value) as e (element)
 where e->>'path' ilike '%.log%'
   and e->>'status' = '200';

 id |         key          |                                   element
----+----------------------+------------------------------------------------------------------------------
  1 | https://example.tld/ | {"path": "page.log", "status": 200, "redirect": null, "content-length": 312}
(1 row)


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM