【问题标题】:postgresql json array querypostgresql json数组查询
【发布时间】:2017-08-17 19:44:57
【问题描述】:

我尝试使用此处的示例查询我的 json 数组:How do I query using fields inside the new PostgreSQL JSON datatype?

他们使用示例:

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

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

    {
    "people": [{
            "name": "Toby",
        "occupation": "Software Engineer"
    },
    {
        "name": "Zaphod",
        "occupation": "Galactic President"
    }
    ]
}

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

我的 Json“数组”不是真正的数组吗?我必须使用这个 Json 字符串,因为它包含在数据库中,所以如果它不是数组,我必须告诉他们修复它。 或者,有没有其他查询方式?

我阅读了文档,但没有任何效果,不断出错。

【问题讨论】:

    标签: arrays json postgresql


    【解决方案1】:

    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
    cross join json_array_elements(my_json->'people') elem
    where elem->>'name' = 'Toby';
    

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

    select elem->>'name' as name, elem->>'occupation' as occupation
    from my_table
    cross join json_array_elements(my_json->'people') elem
    
      name  |     occupation     
    --------+--------------------
     Toby   | Software Engineer
     Zaphod | Galactic President
    (2 rows)    
    

    如果您对托比的职业感兴趣:

    select elem->>'occupation' as occupation
    from my_table
    cross join json_array_elements(my_json->'people') elem
    where elem->>'name' = 'Toby'
    
        occupation     
    -------------------
     Software Engineer
    (1 row)
    

    【讨论】:

    • 谢谢,成功了。我在其他行中有一些不好的数据,所以我只需要选择一个“好”的行。现在我有另一个问题:例如,我怎样才能只选择“职业”?你说的选择 t.* 我只想要“职业”。我试过 t.my_json -> 'occupation' 但没有用。结果显示?列?以及在我的行中不为空的空数据。
    • 你太棒了 B-)
    • 我见过几个人试图解释如何做到这一点,你已经给出了堆栈上最优雅的解决方案。谢谢先生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多