💨

PL/pgSQLで違う種類のデータをまとめて取得する

2024/04/15に公開

目的

ポータルのトップページなどでは、全体を俯瞰するために様々な情報を表示したいことがあります。そうなるとDBから何度もデータを取ってくることになります。そこでここではDBから一度で取ってこれる方法を紹介します。

コード

DROP TYPE IF EXISTS type_my_get_top_page CASCADE;
CREATE TYPE type_my_get_top_page AS (
  user_json_array JSONB[]
  ,company_json_array JSONB[]
  ,book_json_array JSONB[]
);

CREATE OR REPLACE FUNCTION my_get_top_page (
) RETURNS SETOF type_my_get_top_page AS $FUNCTION$
DECLARE
  w_user_json_array JSONB[];
  w_company_json_array JSONB[];
  w_book_json_array JSONB[];
BEGIN
  SELECT
    ARRAY_AGG(to_json(t1.*) ORDER BY t1.created_at ASC)
  INTO
    w_user_json_array
  FROM
    public.users AS t1 
  ;

  SELECT
    ARRAY_AGG(to_json(t1.*) ORDER BY t1.created_at ASC)
  INTO
    w_company_json_array
  FROM
    public.companies AS t1 
  ;

  SELECT
    ARRAY_AGG(to_json(t1.*) ORDER BY t1.created_at ASC)
  INTO
    w_book_json_array
  FROM
    public.books AS t1 
  ;

  RETURN QUERY SELECT
    w_user_json_array
    ,w_company_json_array
    ,w_book_json_array
  ;
END;
$FUNCTION$ LANGUAGE plpgsql;

必要な情報をそれぞれJSONの配列にして返します。
集約するARRAY_AGGではソート条件を指定することも可能なので便利です。

Discussion