PostgreSQL string_agg 関数
Shihab Sikder
2023年6月20日
-
string_agg()
を使用して PostgreSQL で文字列を連結する -
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)
これで、各会社のすべての従業員名が出力されていることがわかります。 Sony
で Bob
が 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