【AWS】Amazon Redshift ~ 文字列結合 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/09/08/202004

の続き。

Redshiftは、PostgreSQL互換と言われているが
ちょこちょこ異なっていること見つかる今日この頃。

今回は、文字列結合について扱い、
PostgreSQLとの差異についても扱う。

目次

【1】Amazon Redshift での文字列結合
 1)CONCAT関数
 2)連結演算子 - 「||」による結合
【2】PostgreSQLとの差異
 1)CONCAT関数単体では、3つ以上の連結はできない
 2)文字列がNULLの場合、結果もNULLになる
【3】サンプル

【1】Amazon Redshift での文字列結合

* 以下の2通り。
* 個人的には、Amazon Redshiftでの文字列結合は、
 「2)連結演算子 - 「||」による結合」にした方がいいと思う
 => 理由は、「【3】PostgreSQLとの差異」を参照

1)CONCAT関数

* 2つの文字列を連結

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_CONCAT.html
構文

CONCAT ( <string1>, <string2> )

サンプル

SELECT CONCAT('Hello', ' World')

2)連結演算子 - 「||」による結合

* 2つ以上の文字列を連結

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_concat_op.html
構文

<string1> || <string2> || ... 

サンプル

SELECT 'Hello' || ' ' || 'World')

【3】PostgreSQLとの差異

* 細かいけど、差異があって、勉強になった、、、

1)CONCAT関数単体では、3つ以上の連結はできない

PostgreSQLとは異なり、
Amazon Redshift において、CONCAT関数単体では、
3つ以上の連結はできない

エラーになるSQL

SELECT
  CONCAT('Hello', '  ', ' World')

エラー内容

ERROR: function concat("unknown", "unknown", "unknown") does not exist

3つ以上連結したい場合

SELECT
  -- [1] 連結演算子「||」を使う(個人的には、こっちでいいのではっと思う)
  'Hello' || ' ' || 'World' AS val1,
  -- [2] ネストして使う
  CONCAT('Hello', CONCAT('  ', ' World')) AS val2

2)文字列がNULLの場合、結果もNULLになる

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_concat_op.html

より抜粋
~~~~~~~~~
CONCAT 関数と連結演算子のどちらにおいても、
一方または両方の文字列が null である場合は、
連結の結果が null になります。
~~~~~~~~~

補足:PostgreSQL : CONCAT関数

https://www.postgresql.jp/document/9.3/html/functions-string.html

concat(str "any" [, str "any" [, ...] ])

すべての引数の結合。ただしNULLは無視される

concat('abcde', 2, NULL, 22) => abcde222

PostgreSQLのCONCAT関数の場合

* 3つ以上の文字列結合可能(可変引数)
* NULLは無視される
 => 将来的に、Redshiftもこうなるのかな、、、

参考文献

https://www.fixes.pub/program/366854.html

関連記事

Amazon Redshift ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/02/22/002139
Amazon Redshift ~ キャスト ~
https://dk521123.hatenablog.com/entry/2021/09/08/202004