【问题标题】:Postgresql, retrieve value for specific key from json arrayPostgresql,从json数组中检索特定键的值
【发布时间】:2018-12-15 04:30:24
【问题描述】:

我有 Postgres JSONB 对象数组,如下所示:

'[
  {
    "skillId": "1",
    "skillLevel": 42
  },
  {
    "skillId": "2",
    "skillLevel": 41
  }
]'

这个 JSONB 是一个函数参数。

skillId = "1" 检索skillLevel 的最有效方法是什么。

我尝试过使用jsonb_array_elements,但到目前为止我所做的一切看起来都非常混乱。

【问题讨论】:

    标签: sql arrays json postgresql jsonb


    【解决方案1】:

    Postgres 9.4+ 中,在横向连接中使用函数 jsonb_array_elements()

    select (elem->>'skillLevel')::int as skill_level
    from my_table
    cross join jsonb_array_elements(json_col) elem
    where elem->>'skillId' = '1';
    

    你可以在一个简单的函数中实现这个想法,例如:

    create or replace function extract_skill_level(json_data jsonb, id int)
    returns integer language sql as $$
        select (elem->>'skillLevel')::int
        from jsonb_array_elements(json_data) elem
        where elem->>'skillId' = id::text
    $$;
    
    select extract_skill_level(json_col, 1) as skill_level
    from my_table;
    

    Postgres 12+ 中,您有一个不错的替代方案,即 jsonb 路径函数:

    select (
        jsonb_path_query(
            json_col, 
            '$[*] ? (@.skillId == "1")'
            )->'skillLevel'
        )::int as skill_level
    from my_table;
    

    Db<>Fiddle.

    阅读更多关于JSON Functions and Operators.

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2021-12-01
      • 1970-01-01
      • 2015-01-20
      相关资源
      最近更新 更多