私は次のようなオブジェクトのPostgresJSONB配列を持っています:
'[
{
"skillId": "1",
"skillLevel": 42
},
{
"skillId": "2",
"skillLevel": 41
}
]'
このJSONBは関数の引数です。
skillId = "1"
のskillLevel
を取得する最も効率的な方法は何ですか。
jsonb_array_elements
で遊んでみましたが、これまでにやったことはすべて本当に散らかっています。
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);