ここに次のデータセットがあります
create table categories(
id serial primary key,
parent_id integer,
name varchar(255) not null
);
create table entry(
id serial primary key,
location_id varchar(255) not null,
location_string varchar(255) not null
);
create table entry_type(
id serial primary key,
name varchar(255) not null,
category_ids integer[]
);
insert into categories(parent_id,name) values
(null,'a'), (null,'b'),(null,'c'), (1,'d'), (2,'e'), (5,'f');
insert into entry_type(name, category_ids) values
('entry_type_1', '{1}'),('entry_type_2', '{4, 3}'),('entry_type_3', '{5, 6}'),('entry_type_1', '{6}');
insert into entry(location_id, location_string) values
('1/4','a/d'),('2','b'),('5/6','e/f'),('5/6','e/f');
私はこのクエリを実行しています:
select
json_build_object(
'id', u.id,
'name', u.name,
'parent_id', u.parent_id,
'entry_type', json_agg(json_build_object(
'id', ur.id,
'name', ur.name
)),
'entries', json_agg(json_build_object(
'id', en.location_string
))
)
from public.categories u
join public.entry_type ur on u.id = any(ur.category_ids)
join public.entry en on en.location_id like concat(u.id::text, '%')
group by u.id;
(これはすべてのフィドルです。)
しかし、以下で説明するように、結果 (JSON) を返す Postgres 関数を作成したいと考えています。
望ましい結果に近づくことができましたが、アイデアがありません。私のクエリでは、すべてのカテゴリを選択しますが、そこに条件を追加できる必要があります。たとえば、parent_id = "function_param"
NULL または別の ID/整数である可能性があります。
[
{
"id": "1",
"name": "a",
"parent_id": null,
"entry_types": [
{
"id": "18"
}
],
"entries": [
{
"id": "54"
},
{
"id": "22"
}
],
"entries_count": 2,
"entry_types_count": 1
},
{
"id": "2",
"name": "b",
"parent_id": null,
"entry_types": [
{
"id": "88"
}
],
"entries": [
{
"id": "28"
}
],
"entries_count": 1,
"entry_types_count": 1
}
]