🤖

PostgreSQLのCONCAT_WS

に公開

CONCAT_WSは、複数の文字列を指定した区切り文字(セパレータ)で連結するためのSQL関数です。

CONCAT_WSは「CONCATenate With Separator」の略で、"セパレータ付きで連結する"という意味になります。


CONCAT_WSの構文

基本的な構文は以下の通りです。

CONCAT_WS(区切り文字, 文字列1, 文字列2, ...)
  • 区切り文字: 連結する文字列の間に挿入する文字を指定します。
  • 文字列1, 文字列2, ...: 連結したい文字列を複数指定します。

CONCAT_WSの主な特徴と利点

1. NULL値を自動的に無視する

CONCAT_WSの最大の利点は、NULL値を自動的に無視してくれる点です。これにより、意図しない区切り文字の重複を防ぎ、クリーンな出力結果を得られます。

:

氏名(姓・ミドルネーム・名)を連結する際、ミドルネームがNULLの場合でも、余分なスペースが入りません。

-- ミドルネームがNULLの場合
SELECT CONCAT_WS(' ', '田中', NULL, '太郎') AS full_name;
-- 結果: '田中 太郎'

これがCONCAT関数だと、NULL値が混じると結果全体がNULLになってしまうことがあります。

-- `CONCAT`関数を使用した場合
SELECT CONCAT('田中 ', NULL, ' 太郎') AS full_name;
-- 結果: NULL

2. 可読性が高い

特に複数のカラムを連結する際に、CONCAT_WSを使うことで、区切り文字を一度だけ指定すれば済むため、SQL文がより簡潔で読みやすくなります。

:

住所の各カラムを連結する際

-- CONCAT_WSを使用
SELECT CONCAT_WS(' ', prefecture, city, street, building_name) AS full_address FROM addresses;

-- CONCAT関数や`||`演算子で同様のことをする場合
SELECT prefecture || ' ' || city || ' ' || street || ' ' || building_name FROM addresses;
-- NULL値の処理を考慮するとさらに複雑になります。

CONCAT_WSが使われる主なシーン

  • 氏名や住所の連結: first_namelast_nameを連結してfull_nameを作成したり、住所の各要素を連結して完全な住所を作成したりする。
  • CSV形式のデータ生成: データをコンマ(,)区切りで連結し、CSV形式の文字列を生成する。
  • レポート用の文字列作成: 複数のカラムの情報を一つの文字列にまとめて、レポートや一覧表示に使う。

このように、CONCAT_WSは文字列の連結をよりスマートに行うための、非常に便利なSQL関数です。PostgreSQL, MySQL, SQL Serverなど、主要なデータベースのほとんどでサポートされています。

Discussion