PostgreSQLでSELECT文の取得項目を結合する際に、||(ダブルパイプ)を使用していましたが、なぜかNULLになるデータがありました。
調べてみると、結合する文字列のいずれかにNULLを含む場合、||だと全体がNULLになってしまうみたいです。
このような場合は、NULLを無視するconcat関数を使用しましょう。
なお、今回のバージョンは以下の通りです。
- psql(PostgreSQL) 9.4.13
NULLを含む場合、||(ダブルパイプ)だと全体がNULLになる
このようなテーブルがあったとします。
田中さんの名前はNULLです。
no | sei | mei |
---|---|---|
101 | 山田 | 太郎 |
102 | 山田 | 次郎 |
103 | 田中 | NULL |
以下のSQLで、||を使用して姓・名を結合したフルネームを取得します。
select
no
,sei || mei as full_name
from
user
結果はこのようになります。
結合する文字列にNULLが含まれるので、「田中」とはならず、NULLになってしまいます。
no | full_name ----+---------- 101 | 山田太郎 102 | 山田次郎 103 | NULL
NULLを無視するconcat関数で文字列結合
NULL値を含む文字列結合では、concat関数を使用すればNULLを無視して結合してくれます。
concat関数の構文はこちらです。
【構文】 concat(str, str [, …]) 【説明】 すべての引数の結合。ただしNULLは無視される。
では、先ほどと同様のテーブルとSQLを||からconcatに変えてみます。
select
no
,concat(sei, mei) as full_name
from
user
結果はこのように、姓のみ「田中」が取得できています。
no | full_name ----+---------- 101 | 山田太郎 102 | 山田次郎 103 | 田中
おそらくこちらの方が意図する結果だと思います。
区切り文字を指定して結合するconcat_ws関数もあります。
concat_ws関数の構文はこちらです。
【構文】 concat_ws(sep text, str, str [, …]) 【説明】 第一引数を区切り文字とし、残りのすべての引数を結合する。 最初の引数は区切り文字列として使われる。NULLは無視される。
条件式coalesceでもNULL対応可能
concat関数以外にも、条件式のcoalesceを使用すれば、同じようにNULLを含む文字列結合ができます。
coalesceの構文はこちらです。
【構文】 coalesce(value [, …]) 【説明】 NULLでない最初の引数を返す。 全ての引数がNULLの場合にのみNULLが返される。
NULLが含まれる可能性がある項目に対して、coalesceを使用して第2引数に空文字を指定すればNULLになることはありません。
select
no
,coalesce(sei, '') || coalesce(mei, '') as full_name
from
user
これで、concat関数と同じように意図した通りの結果になると思います。
最後に
今回は、PostgreSQLの文字列結合のconcat関数を紹介しました。
NULLを含む文字列の結合は、||(ダブルパイプ)ではなくconcat関数を使用した方が意図した結果になると思います。
コメント