本記事では以下の内容を見ていきます.
- 列に含まれる文字列の結合
- 結合した文字列をコンマ区切りで取得
例示を見ながら確認していきましょう.
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 |
青井 | 大輔 | 青井 大輔 |
渡邊 | 輝 | 渡邊 輝 |
結合した文字列をコンマ区切りで取得
先ほどは行ごとに姓・名の結合結果を取得しました.
ここでは姓・名の結合結果をまとめて取得+コンマ区切りとする方法を見てみましょう.
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側で文字列を色々と操作することができると便利ですね.