PostgreSQLで文字列を結合,STRING_AGGによるコンマ区切り

  • Category: SQL
  • Tags: PostgreSQL

  • Posted on: 2022-01-22

  • Updated on: 2022-09-12

本記事では以下の内容を見ていきます.

  • 列に含まれる文字列の結合
  • 結合した文字列をコンマ区切りで取得

例示を見ながら確認していきましょう.

PostgreSQLのバージョン

psql (PostgreSQL) 14.5

事前準備

まずはサンプルのテーブルを作成します.
姓・名がそれぞれ列に格納されたデータです.


CREATE TABLE name_list (
    id serial PRIMARY KEY, -- 番号
    group_ VARCHAR(5), -- グループ
    first_name VARCHAR(30), -- 名
    last_name VARCHAR(30) -- 姓
);

INSERT INTO name_list (group_, first_name, last_name)
VALUES
    ('A', 'ABC', 'EFG'),
    ('A', 'ZYX', 'DEF'),
    ('B', 'Taro', 'Suzuki'),
    ('C', '青井', '大輔'),
    ('C', '渡邊', '輝')
;

SELECT * FROM name_list;
id group_ first_name last_name
1 A ABC EFG
2 A ZYX DEF
3 B Taro Suzuki
4 C 青井 大輔
5 C 渡邊

列に含まれる文字列の結合

first_name列とlast_name列の文字列を結合し,フルネームが入った列を作成します.
文字列を結合するには||演算子を使用します.


SELECT
    first_name, 
    last_name,
    first_name || ' ' || last_name AS full_name
FROM
    name_list;
first_name last_name full_name
ABC EFG ABC EFG
ZYX DEF ZYX DEF
Taro Suzuki Taro Suzuki
青井 大輔 青井 大輔
渡邊 渡邊 輝

first_name || ' ' || last_nameで2列の文字列を半角スペースで結合させています.
結果として姓・名が半角スペースで区切られた列が取得できます.1

concatを使用する方法

文字列の結合は||演算子だけでなくCONCAT()関数でも可能です.


SELECT
    first_name, 
    last_name,
    CONCAT(first_name, ' ', last_name) AS full_name
FROM
    name_list;
first_name last_name full_name
ABC EFG ABC EFG
ZYX DEF ZYX DEF
Taro Suzuki Taro Suzuki
青井 大輔 青井 大輔
渡邊 渡邊 輝

関連記事

||演算子とCONCAT()関数に関する関連記事はこちらです.

結合した文字列をコンマ区切りで取得

先ほどは行ごとに姓・名の結合結果を取得しました.
ここでは姓・名の結合結果をまとめて取得+コンマ区切りとする方法を見てみましょう.

STRING_AGG()関数を使用して以下のように記載します.


SELECT
    STRING_AGG(
        first_name || ' ' || last_name, ','
    ) AS full_names
FROM
    name_list
;
full_names
ABC EFG,ZYX DEF,Taro Suzuki,青井 大輔,渡邊 輝

解説

STRING_AGG()関数の引数は以下のとおりです.

  • 第一引数:文字列を指定します.今回は姓名を結合したいのでその処理を指定.
  • 第二引数:取得する文字列の区切り方を指定します.今回はコンマを指定.
  • 第三引数:取得した結果の並び替えを指定.2

参考

STRING_AGG()は集約関数の仲間ですので,取得できる結果は1つです.

結合した文字列を並び替える

STRING_AGG()の第三引数にはORDER BY句を指定することが可能です.
そのため,以下のようにすれば取得する文字列の並びを変更することができます.


SELECT
    STRING_AGG(
        first_name || ' ' || last_name, ','
        ORDER BY first_name
    ) AS full_names
FROM
    name_list
;
full_names
ABC EFG,Taro Suzuki,ZYX DEF,渡邊 輝,青井 大輔

ORDER BY句で指定したfirst_name列に従って並び替えられるので「ABC EFG, Taro Suzuki, ZYX DEF」の順になりました.

注意

日本語の並び替えはふりがなカラムの追加,データ型を調整などが必要です・・・

グループごとに結果を取得

STRING_AGG()関数とGROUP BY句を組み合わせて使うこともできます.
group_列の値で集約した結果を取得するには以下のクエリです.


SELECT
    group_,
    STRING_AGG(
        first_name || ' ' || last_name, ','
        ORDER BY first_name
    ) AS full_names
FROM
    name_list
GROUP BY
    group_
;
group_ full_names
A ABC EFG,ZYX DEF
B Taro Suzuki
C 渡邊 輝,青井 大輔

グループごとに姓・名の結合結果が得られましたね.

参考

行すべてでSTRING_AGG()関数の結果が欲しい場合はOVER()を使用すればOKです.


SELECT
    first_name,
    last_name,
    STRING_AGG(
        first_name || ' ' || last_name, ','
    ) OVER() AS full_names
FROM
    name_list
;
first_name last_name full_names
ABC EFG ABC EFG,ZYX DEF,Taro Suzuki,青井 大輔,渡邊 輝
ZYX DEF ABC EFG,ZYX DEF,Taro Suzuki,青井 大輔,渡邊 輝
Taro Suzuki ABC EFG,ZYX DEF,Taro Suzuki,青井 大輔,渡邊 輝
青井 大輔 ABC EFG,ZYX DEF,Taro Suzuki,青井 大輔,渡邊 輝
渡邊 ABC EFG,ZYX DEF,Taro Suzuki,青井 大輔,渡邊 輝

ひとこと

SQL側で文字列を色々と操作することができると便利ですね.


  1. AS full_nameの部分は取得するカラムに名前をつけています. 

  2. 上記のクエリでは指定していません.詳細は次項を参照.