PostgreSQL JSON数组查询

Arm*_*rea 5 arrays postgresql json

我尝试使用以下示例查询json数组:如何使用新PostgreSQL JSON数据类型内的字段进行查询?

他们使用示例:

SELECT *
FROM   json_array_elements(
  '[{"name": "Toby", "occupation": "Software Engineer"},
    {"name": "Zaphod", "occupation": "Galactic President"} ]'
  ) AS elem
WHERE elem->>'name' = 'Toby';
Run Code Online (Sandbox Code Playgroud)

但是我的Json数组看起来更像这样(如果使用示例):

    {
    "people": [{
            "name": "Toby",
        "occupation": "Software Engineer"
    },
    {
        "name": "Zaphod",
        "occupation": "Galactic President"
    }
    ]
}
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:错误:无法在非数组上调用json_array_elements

我的Json“数组”不是数组吗?我必须使用此Json字符串,因为它包含在数据库中,因此如果它不是数组,则必须告诉他们对其进行修复。或者,还有另一种查询方法吗?

我阅读了文档,但无济于事,并不断出错。

kli*_*lin 9

json数组具有一个键,people因此可以my_json->'people'在函数中使用:

with my_table(my_json) as (
values(
'{
    "people": [
        {
            "name": "Toby",
            "occupation": "Software Engineer"
        },
        {
            "name": "Zaphod",
            "occupation": "Galactic President"
        }
    ]
}'::json)
)
select t.*
from my_table t,
json_array_elements(my_json->'people') elem
where elem->>'name' = 'Toby';
Run Code Online (Sandbox Code Playgroud)

该函数json_array_elements()取消嵌套json数组,并将其所有元素生成为行:

select elem->>'name' as name, elem->>'occupation' as occupation
from my_table t,
json_array_elements(my_json->'people') elem

  name  |     occupation     
--------+--------------------
 Toby   | Software Engineer
 Zaphod | Galactic President
(2 rows)    
Run Code Online (Sandbox Code Playgroud)

如果您对Toby的职业感兴趣:

select elem->>'occupation' as occupation
from my_table t,
json_array_elements(my_json->'people') elem
where elem->>'name' = 'Toby'

    occupation     
-------------------
 Software Engineer
(1 row)
Run Code Online (Sandbox Code Playgroud)

  • 我见过几个人试图解释如何做到这一点,并且您已经给出了堆栈上最优雅的解决方案。谢谢你,先生。 (2认同)