PostgreSQL NULLを含む文字列結合は||(パイプ)ではなくconcatを使う | 俺の開発研究所

データベース|俺の開発研究所 データベース「データベース」の記事一覧です。

||(ダブルパイプ)でSELECT文の項目を結合しようとしたら、なぜか一部のデータがNULLになってしまった。
||.
このような場合、NULLを無視するためにconcat関数を使用します。

これはpsqlのバージョンです。

  • psql(PostgreSQL)9.4.13です。

||(ダブルパイプ)を使用すると、テーブル全体がNULLになります。

このようなテーブルがあったと想像してください。
田中さんという名前はNULL

田中さんの名前はNULLです。 sei mei
101 山田 太郎
102 山田 次郎
103 田中 NULL

|姓と名を連結する。

|| mei as full_namefrom ユーザー

これが最終的な結果です。
連結する文字列はNULLリッチなので、結果は「田中」ではなく、NULLになります。

no|full_name-----+----------101|山田太郎102|山田次郎103|NULL

NULLを無視するconcat関数による文字列の連結

concat関数は、NULL値を含む文字列を連結する際にNULLを無視し、代わりに連結します。
concat関数の構文はこちらで確認できます。

構文] concat[str] str [...])説明] 文字列を結合します。すべての引数を結合します。Null は考慮されません。

|| を指定すると、従来通りconcatされます。

user から no,concat(sei), mei を full_name として選択。

姓である「田中」だけが取得されていることがわかります。

no|full_name-----+----------101|山田太郎102|山田次郎103|田中

これは望ましい結果かもしれません。

concat_ws 関数は、デリミタと concat_ws 関数を組み合わせて使うこともできます。
concat_ws の構文はこちらで確認できます。

構文] concat_ws (sep text., str., str. [, ...])])最初の引数をデリミターとして、すべての引数を連結する。デリミタ文字列としては、最初の引数が使用されます。

NULLは無視されるべきです。coalesce 条件式は NULL を扱うことができる。

coalesce 条件式と一緒に concat 関数を使用すると、NULL を含む文字列を連結することもできます。
これは coalesce のシンタックスです。

構文] coalesce (value [, ...]) 最初の引数のうち、NULLでないものを返します。すべての引数がNULLの場合、NULLが返されます。

NULLを含む項目に対してNULLでないことを保証するために、coalesceを使用して第2引数に空の文字列を指定することができます。

|| coalesce(mei, '') as full_namefrom user

この関数はconcat関数と同じように望ましい結果を生成するはずです。

最後に

この記事では、PostgreSQLのconcat関数による文字列連結を紹介しました。
||(ダブルパイプ)です。

関連読書:

ドラゴンボール超 スーパーヒーロー:「ブロリー」より4年 新キャラが登場!

神作『無職転生~異世界行ったら本気出す~』の大推薦!

2022年夏|7月放送最新作TVアニメ情報まとめ!おすすめ6選を紹介!