PostgreSQL string_agg 関数

Shihab Sikder 2023年6月20日
  1. string_agg() を使用して PostgreSQL で文字列を連結する
  2. PostgreSQL の string_agg() からの重複を置き換えます
  3. PostgreSQL の string_agg() での注文
PostgreSQL string_agg 関数

この記事では、string_agg() 関数を使用して、PostgreSQL の GROUP BY クエリで文字列フィールドの文字列を連結する方法について説明します。

string_agg() を使用して PostgreSQL で文字列を連結する

string_agg() はヌル文字を含まない文字列を結合します。 列名と区切り文字 (コンマ、ダッシュ、文字) を入力として受け取ります。

従業員と関連会社の次の表があります。 会社ごとに、すべての従業員名をコンマで区切ってリストするよう求められます。

これが私たちが持っている次のデータです。

postgres=# SELECT * from employee;
 id | companyname | employeename | salary
----+-------------+--------------+---------
  1 | Sony        | Bob          | 1500.55
  2 | Sony        | Bob          | 1500.55
  3 | Sony        | Jhon         |    2000
  4 | Sony        | Dow          |   15000
  5 | Sony        | Alice        |    5602
  6 | Google      | Jade         | 1500.55
  7 | Google      | Penny        | 1500.55
  8 | Google      | Kat          | 1500.55
  9 | Google      | Merly        | 1500.55
 10 | Hitachi     | Raymond      | 1500.55
 11 | Hitachi     | Skye         | 1500.55
 12 | Hitachi     | Sova         | 1500.55
 13 | Hitachi     | Jenny        | 1500.55

string_agg を使用してみましょう。これは 会社名 でグループ化されます。 ここで、エントリが 2つあることに注意してください。

PSQL で string_agg() を使用する

SELECT companyname As CompanyName, STRING_AGG(employeename,', ') as Employees
FROM employee
GROUP BY companyname;

出力:

 companyname |         employees
-------------+----------------------------
 Sony        | Bob, Bob, Jhon, Dow, Alice
 Google      | Jade, Penny, Kat, Merly
 Hitachi     | Raymond, Skye, Sova, Jenny
(3 rows)

これで、各会社のすべての従業員名が出力されていることがわかります。 SonyBob が 2 回印刷されていることがわかります。

PostgreSQL の string_agg() からの重複を置き換えます

重複を削除するには、string_agg() 関数で、連結する列名の前に DISTINCT キーワードを追加します。

したがって、string_agg() から重複を削除する上記の SQL の変更は、次のようになります。

SELECT companyname As CompanyName, STRING_AGG(employeename,', ') as Employees
FROM employee
GROUP BY companyname;

出力:

 companyname |         employees
-------------+----------------------------
 Google      | Jade, Kat, Merly, Penny
 Hitachi     | Jenny, Raymond, Skye, Sovav
 Sony        | Alice, Bob, Dow, Jhon
(3 rows)

PostgreSQL の string_agg() での注文

string_agg() 関数は SQL クエリとしてパラメータを取ることができます。 したがって、たとえば、単純に順序を記述するのではなく逆の順序で文字列を連結する場合は、出力文字列の順序を変更できます。

したがって、更新されたコードは次のようになります。

SELECT companyname As CompanyName, STRING_AGG(DISTINCT employeename,', ' ORDER BY employeename desc) as Employees
FROM employee
GROUP BY companyname;

出力:

 companyname |         employees
-------------+----------------------------
 Google      | Penny, Merly, Kat, Jade
 Hitachi     | Sova, Skye, Raymond, Jenny
 Sony        | Jhon, Dow, Bob, Alice
(3 rows)

string_aggブログ はこちらです。 また、公式ドキュメント を参照することもできます。

create table および insert コマンドは、この pastebin リンク から見つけることができます。

著者: Shihab Sikder
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website

関連記事 - PostgreSQL String