🤖
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_name
とlast_name
を連結してfull_name
を作成したり、住所の各要素を連結して完全な住所を作成したりする。 -
CSV形式のデータ生成: データをコンマ(
,
)区切りで連結し、CSV形式の文字列を生成する。 - レポート用の文字列作成: 複数のカラムの情報を一つの文字列にまとめて、レポートや一覧表示に使う。
このように、CONCAT_WS
は文字列の連結をよりスマートに行うための、非常に便利なSQL関数です。PostgreSQL, MySQL, SQL Serverなど、主要なデータベースのほとんどでサポートされています。
Discussion