PostgreSQL NULLを含む文字列結合は||(パイプ)ではなくconcatを使う

PostgreSQLデータベース
この記事は約3分で読めます。

PostgreSQLでSELECT文の取得項目を結合する際に、||ダブルパイプ)を使用していましたが、なぜかNULLになるデータがありました。
調べてみると、結合する文字列のいずれかにNULLを含む場合、||だと全体がNULLになってしまうみたいです。
このような場合は、NULLを無視するconcat関数を使用しましょう。

なお、今回のバージョンは以下の通りです。

  • psql(PostgreSQL) 9.4.13

NULLを含む場合、||(ダブルパイプ)だと全体がNULLになる

このようなテーブルがあったとします。
田中さんの名前はNULLです。

noseimei
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関数を使用した方が意図した結果になると思います。

データベース
えふめん

大阪在住、30代。
業務系SE・社内SEの仕事を通じて学んだこと、PCトラブルで困って調べたこと、手作業を効率化して改善したこと、WordPressのブログ運営などの記事を書いています。

えふめんをフォローする
\よかったらシェアしてね/
この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
俺の開発研究所

コメント

タイトルとURLをコピーしました