基于对象属性的JSON数组中对象的PostgreSQL JsonB查询

基于对象属性的JSON数组中对象的PostgreSQL JsonB查询,sql,json,postgresql,jsonb,Sql,Json,Postgresql,Jsonb,因此,我已经看到了一些关于StackOverflow的其他回答,但没有一个对我有效 { "data": { "list": [ {"id": "2ac5bf6f-bc4a-49e8-8f9f-bc518a839981", "type": "type1"}, {"id": "d15ac090-11ce-4c0c-a05d-d4238f01e8b0", "type": "type3"}, {"id": "

因此,我已经看到了一些关于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"}]';
这不会返回任何结果

有人知道如何轻松地执行此操作吗?

您可以使用函数选择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)

很酷,这是可行的,在类似的情况下,如果我有一个问题的id并且想更新它的type属性,我该如何进行更新?在Postgres 9.4中,没有修改jsonb元素的功能。您可以整体更新jsonb值。请参阅相关答案:和。在中,您将能够使用函数
jsonb_set()