PostgreSQLで文字列を結合(CONCAT, CONCAT_WS)

  • Category: SQL
  • Tags: PostgreSQL

  • Posted on: 2022-01-26

  • Updated on: 2022-09-12

本記事では以下の内容を見ていきます.

  • ||演算子,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()WSwith 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で整形しておくと後続の処理が楽ですね.
住所や姓名の結合などに使用できそうです.

関連記事

文字列結合に関する記事はこちらです.


  1. 詳細は「||演算子とCONCAT()の違い」の項を参照.ここではセパレーターの指定を見ています. 

  2. CONCAT_WS()CONCAT()と同様に引数の数に限りはありません.