本記事では以下の内容を見ていきます.
||
演算子,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で整形しておくと後続の処理が楽ですね.
住所や姓名の結合などに使用できそうです.