0

ここに次のデータセットがあります

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
  }
]
4

1 に答える 1