本記事では以下の内容を見ていきます.
||演算子,CONCAT()を使用した文字列の結合||演算子,CONCAT()の違いCONCAT_WS()を使用した文字列の結合
例示を見ながら確認していきましょう.
PostgreSQLのバージョン
psql (PostgreSQL) 14.5
事前準備
まずはサンプルのテーブルを作成します.
CREATE TABLE str_table (
id serial PRIMARY KEY, -- 番号
str_1 VARCHAR(5),
str_2 VARCHAR(5)
);
INSERT INTO str_table (str_1, str_2)
VALUES
('あ', 'い'),
('App', 'le'),
('GH', NULL)
;
SELECT * FROM str_table;
| id | str_1 | str_2 |
|---|---|---|
| 1 | あ | い |
| 2 | App | le |
| 3 | GH | [null] |
||演算子による文字列結合
まずは||演算子を見てみましょう.
SELECT
str_1,
str_2,
str_1 || ' ' || str_2 AS str_1_and_str_2
FROM
str_table;
| str_1 | str_2 | str_1_and_str_2 |
|---|---|---|
| あ | い | あ い |
| App | le | App le |
| GH | [null] | [null] |
結合したい文字列(を含む列)を||演算子で繋げて結合しています.
str_1 || 任意の文字列(半角スペース) || str_2としているので,結果としてはstr_1,str_2の文字列が半角スペースで結合されています.
なお,||演算子を追加すれば好きなだけ文字列を結合することができます.
CONCAT()による文字列結合
次にCONCAT()を使用した文字列結合を見てみましょう.
SELECT
str_1,
str_2,
CONCAT(str_1, ' ', str_2) AS str_1_and_str_2
FROM
str_table;
| str_1 | str_2 | str_1_and_str_2 |
|---|---|---|
| あ | い | あ い |
| App | le | App le |
| GH | [null] | GH |
CONCAT()は引数に指定した文字列が順に結合されます.
なお||演算子と同様に引数は好きなだけ指定できます.
CONCAT_WS()による文字列結合
CONCAT_WS()は基本的にCONCAT()と同じです.
両者の違いはセパレーター(区切り文字)の指定可否とNULL存在時の挙動1です.
SELECT
str_1,
str_2,
CONCAT_WS(' ', str_1, str_2)
FROM
str_table;
| str_1 | str_2 | concat_ws |
|---|---|---|
| あ | い | あ い |
| App | le | App le |
| GH | [null] | GH |
CONCAT_WS()は第一引数にセパレーターを指定し,第二引数以降はセパレーターで区切りたい文字列を指定します.2
例示では' '(=半角スペース)をセパレーターとしているため,その後の2つの引数が半角スペースで区切られて結合しています.
参考
CONCAT_WS()のWSは with separator に由来します.
||演算子とCONCAT()の違い
||演算子とCONCAT()(CONCAT_WS())は文字列を結合するものですが,違いは以下のとおりです.
- NULLの処理
- 処理速度
- 結果のカラム名
NULLの処理
||演算子は結合文字列にNULLが含まれている場合,他の文字に関わらずNULLを返します.
SELECT 'A' || ',' || NULL || ',' || 'C'
| ?column? |
|---|
| [null] |
一方CONCAT()はNULLを無視して結合するため,NULL以外の指定された文字列を結合して返します.
SELECT CONCAT('A', ',', NULL, ',', 'C')
| concat |
|---|
| A,,C |
CONCAT()は文字列を単純に結合するので,結果は上記のように「A , , C」となります.
一方でCONCAT_WS()の場合は文字同士をセパレーターで区切るという指定をしているため,NULLがあっても余分なコンマ(区切り)は付与されません.
SELECT CONCAT_WS(',', 'A', NULL, 'C')
| concat_ws |
|---|
| A,C |
処理速度
処理速度は||演算子が最も高速です.
CONCAT(), CONCAT_WS()は関数呼び出しがあるため||演算子よりは低速です.
結果のカラム名
最後の違いは微妙ですが||演算子とCONCAT()(CONCAT_WS())では結果のカラム名が異なります.

ASでカラム名を指定すれば特に困ることはないです!
ひとこと
文字列をSQLで整形しておくと後続の処理が楽ですね.
住所や姓名の結合などに使用できそうです.