代码之家  ›  专栏  ›  技术社区  ›  Aliaksei Stadnik

postgresql,从json数组中检索特定键的值

  •  3
  • Aliaksei Stadnik  · 技术社区  · 6 年前

    我有postgres jsonb对象数组,如下所示:

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

    这个jsonb是一个函数参数。

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

    我试过玩 jsonb_array_elements 但到目前为止我所做的一切看起来都很混乱。

    1 回复  |  直到 6 年前
        1
  •  7
  •   klin    6 年前
    with my_table(data) as (
    values
    ('[
      {
        "skillId": "1",
        "skillLevel": 42
      },
      {
        "skillId": "2",
        "skillLevel": 41
      }
    ]'::jsonb)
    )
    
    select elem->>'skillLevel' as skill_level
    from my_table
    cross join jsonb_array_elements(data) elem
    where elem->>'skillId' = '1';
    
     skill_level 
    -------------
     42
    (1 row) 
    

    以上是最简单的方法,您可以在函数中使用该思想,例如:

    create or replace function extract_skill_level(data jsonb, id int)
    returns integer language sql as $$
        select (elem->>'skillLevel')::int
        from jsonb_array_elements(data) elem
        where elem->>'skillId' = id::text
    $$;
    
    select extract_skill_level
        ('[
          {
            "skillId": "1",
            "skillLevel": 42
          },
          {
            "skillId": "2",
            "skillLevel": 41
          }
        ]', 1);