[英]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.