[英]PostgreSQL JsonB query for object in JSON array based on object attributes
所以我已經在 StackOverflow 上看到了對這個問題的其他一些回復,但沒有一個對我有用。
{
"data": {
"list": [
{"id": "2ac5bf6f-bc4a-49e8-8f9f-bc518a839981", "type": "type1"},
{"id": "d15ac090-11ce-4c0c-a05d-d4238f01e8b0", "type": "type3"},
{"id": "b98958fa-87c4-4dcc-aa84-beaf2b32c5c0", "type": "type1"},
{"id": "854f4d2a-f37c-42cb-9a1f-17a15454a314", "type": "type2"},
{"id": "555816da-4547-4a82-9e7e-1e92515bd82b", "type": "type2"},
{"id": "0f7f4ced-61c2-45da-b15c-0e12058f66a7", "type": "type4"}
]
}
}
這個 Json 存儲在一個名為“questions”的字段中,現在我想在這個表中查詢列表中具有某個 id 的對象。 所以說我有 id 555816da-4547-4a82-9e7e-1e92515bd82b
,我想返回
{"id": "555816da-4547-4a82-9e7e-1e92515bd82b", "type": "type2"}
我在互聯網上看到的(主要是這里)沒有奏效的解決方案在這里:
SELECT questions->'data'->'list'
FROM assignments
WHERE id='81asd6230-126d-4bc8-9745-c4333338115c'
AND questions->'data'->'list' @> '[{"id":"854f4d2a-f37c-42cb-9a1f-17a15454a314"}]';
我已經在多個不同的響應中看到了這個解決方案,但它根本沒有縮小數組的范圍,它每次都返回完整的東西。 where 子句中的第一個 id 是我想要的特定分配對象的 id,它在這里幾乎無關緊要。
SELECT questions->'data'->'list'
FROM assignments
WHERE id='81asd6230-126d-4bc8-9745-c4333338115c'
AND questions->'data'->'list' @> '[{"id":"854f4d2a-f37c-42cb-9a1f-17a15454a314"}]';
這不返回任何內容。
有誰知道如何輕松做到這一點?
您可以使用函數jsonb_array_elements(jsonb)
選擇 json 數組的所有元素:
select jsonb_array_elements(questions->'data'->'list') elem
from assignments
where id='81asd6230-126d-4bc8-9745-c4333338115c'
elem
-----------------------------------------------------------------
{"id": "2ac5bf6f-bc4a-49e8-8f9f-bc518a839981", "type": "type1"}
{"id": "d15ac090-11ce-4c0c-a05d-d4238f01e8b0", "type": "type3"}
{"id": "b98958fa-87c4-4dcc-aa84-beaf2b32c5c0", "type": "type1"}
{"id": "854f4d2a-f37c-42cb-9a1f-17a15454a314", "type": "type2"}
{"id": "555816da-4547-4a82-9e7e-1e92515bd82b", "type": "type2"}
{"id": "0f7f4ced-61c2-45da-b15c-0e12058f66a7", "type": "type4"}
(6 rows)
如果要選擇具有特定id
的元素,請使用上述查詢:
select elem
from (
select jsonb_array_elements(questions->'data'->'list') elem
from assignments
where id='81asd6230-126d-4bc8-9745-c4333338115c'
) sub
where elem->>'id' = '854f4d2a-f37c-42cb-9a1f-17a15454a314'
elem
-----------------------------------------------------------------
{"id": "854f4d2a-f37c-42cb-9a1f-17a15454a314", "type": "type2"}
(1 row)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.