はじめに:PostgreSQLの文字結合はなぜ重要か
PostgreSQLを使ってデータベースを操作していると、複数のカラムに分かれている文字列データを一つにまとめて表示したり、レポートを作成したりする必要が出てきます。例えば、「姓」と「名」を結合して「氏名」にしたり、「都道府県」「市区町村」「番地」を結合して「完全な住所」を作成したりといった作業です。
この「文字列を結合する」作業は、データベースの文字結合機能を使って実現します。これは、データを活用し、より見やすい形で出力するための基本中の基本となるスキルです。
データ活用の土台となる文字結合
PostgreSQLには、この文字結合を行うための便利な機能がいくつか用意されています。この記事では、特に利用頻度の高い3つの方法 — ||(パイプライン演算子)、CONCAT 関数、そして CONCAT_WS 関数 — に焦点を当て、それぞれの使い方、違い、そして最適な使い分けについて、初心者の方にも分かりやすく解説していきます。
PostgreSQLの文字結合:3つの主要な方法
PostgreSQLで文字結合を行う主要な方法は、以下の3つです。
| 方法 | SQL構文 | 特徴 |
| パイプライン演算子 | string1 || string2 | NULLが含まれていると全体がNULLになる。 |
CONCAT 関数 | CONCAT(string1, string2, ...) | 複数の引数を指定可能。NULLを自動で無視して結合する。 |
CONCAT_WS 関数 | CONCAT_WS(separator, string1, ...) | 区切り文字 (WS: With Separator) を指定して結合できる。NULL値は無視される。 |
方法1: パイプライン演算子 || による結合
||(縦棒を2本並べたパイプライン演算子)は、PostgreSQLで最も古くから使われている、基本的な文字結合の方法です。
SELECT '山田' || '太郎';
-- 結果: 山田太郎
SELECT '東京都' || '港区' || '芝公園';
-- 結果: 東京都港区芝公園
SELECT '東京都' || NULL || '芝公園';
-- 結果: NULL注意点として、結合する文字列の中に一つでもNULLが含まれていると、結果全体がNULLになってしまいます。
方法2: CONCAT 関数による結合
CONCAT 関数は、CONCAT(文字列1, 文字列2, ...) の形式で、複数の文字列を結合します。この関数の最大の特徴は、結合対象にNULL値が含まれていても、それを自動で無視して結合を実行する点です。
SELECT CONCAT('山田', '太郎');
-- 結果: 山田太郎 (||と同じ)
SELECT CONCAT('東京都', NULL, '芝公園');
-- 結果: 東京都芝公園 (NULL値が無視される)もし、結合するデータの中にNULLが含まれる可能性がある場合は、||よりもCONCAT関数を使う方が安全で、意図しないNULL値の出現を防げます。
方法3: 区切り文字を指定できる CONCAT_WS 関数
CONCAT_WS(CONCAT With Separator)関数は、文字結合の際に、文字列と文字列の間に挿入する区切り文字を最初に指定できる、非常に便利な関数です。
構文は CONCAT_WS(区切り文字, 文字列1, 文字列2, ...) となります。また、この関数もCONCATと同様に、NULL値を無視して結合します。
-- 区切り文字としてスペースを指定
SELECT CONCAT_WS(' ', '山田', '太郎');
-- 結果: 山田 太郎
-- 区切り文字としてハイフンを指定し、NULL値を無視
SELECT CONCAT_WS('-', '090', NULL, '1234', '5678');
-- 結果: 090-1234-5678リスト形式での出力や、住所、電話番号などを整形して表示したい場合に、CONCAT_WSは非常に強力なツールとなります。
【徹底比較】3つの文字結合方法の違いと選び方
これら3つのPostgreSQLの文字結合方法は、一見すると同じ結果を出力しますが、特にNULL値の扱いにおいて決定的な違いがあります。
NULL値(ヌル値)の扱いに注目
これが、3つの方法を選ぶ際の最も重要なポイントです。
| 方法 | NULL値が含まれていた場合 |
|| | 全体がNULLになる |
CONCAT 関数 | NULL値を 無視 して結合を続行する |
CONCAT_WS 関数 | NULL値を 無視 して結合を続行する(区切り文字も挿入されない) |
||が適しているケース: 結合する要素の全てが揃っていることが必須条件であり、一つでも欠けていたら結合自体を無効にしたい場合。
CONCAT/CONCAT_WSが適しているケース: データの一部が欠けていても(NULLでも)、残りのデータで結合を実行し、可能な限り出力を行いたい場合。
具体的な使い分けのシナリオ
- 最もシンプルな結合:文字列データが全て存在することが保証されている場合は、シンプルな
||演算子。 - NULL値を無視し、結合したい:カラムにNULL値の可能性があるが、区切り文字は不要な場合は
CONCAT関数。 - NULL値を無視し、区切り文字も入れたい:住所や氏名など、区切り文字が必要で、かつNULL値の可能性もある場合は
CONCAT_WS関数。
PostgreSQLのバージョンによる考慮事項
かつては||演算子が主流でしたが、現在ではNULL値を安全に処理できるCONCATやCONCAT_WSの利用が推奨されるケースが増えています。特に新しいプロジェクトや、データ品質が不安定なデータを扱う場合は、CONCAT系関数を使うことで、より堅牢なSQL文を作成できます。
実践!文字結合を用いた具体的なSQLコード例
架空の顧客テーブルcustomersを例に、具体的なSQLコードを見てみましょう。
| id | first_name | last_name | middle_name |
| 1 | 太郎 | 山田 | F |
| 2 | 花子 | 佐藤 | NULL |
氏名を結合する結合例(NULL値の考慮)
「姓 + ミドルネーム + 名」を結合する場合、中間名(middle_name)がNULLの可能性があります。
CASE 1: ||演算子で結合した場合 (中間名がNULLのレコードの氏名全体がNULLになる)
SELECT
last_name || ' ' || middle_name || ' ' || first_name AS full_name_pipe
FROM
customers;| full_name_pipe |
| 山田 F 太郎 |
| NULL |
CASE 2: CONCAT_WS関数で結合した場合 (NULL値は無視され、存在するデータのみがスペースで結合される)
SELECT
CONCAT_WS(' ', last_name, middle_name, first_name) AS full_name_concat_ws
FROM
customers;| full_name_pipe |
| 山田 F 太郎 |
| 佐藤 花子 |
この例からも、PostgreSQLで文字結合を行う際、特にデータに欠損がある場合はCONCATもしくはCONCAT_WSが非常に強力であることがわかります。
まとめ:文字結合をマスターしてデータ操作を加速させよう
PostgreSQLにおける文字結合は、データの表示形式を整える上で欠かせない基本的な技術です。
- シンプルさ重視なら:
||演算子 - NULL値を無視して結合したいなら:
CONCAT関数 - 区切り文字が必要でNULL値も無視したいなら:
CONCAT_WS関数
これらの文字結合方法を適切に使い分けることで、あなたのSQLクエリはより読みやすく、より堅牢になります。まずは簡単なデータで試してみて、それぞれの関数の挙動を体感してみてください。PostgreSQLを使ったデータ操作の幅が大きく広がるはずです。
DB関連おすすめ書籍
基礎から実務レベルまで体系的に学べる“DBエンジニア必携の2冊”として特におすすめです。



コメント