Oracle SQL 関数 : CONCAT : 文字列連結

 stringRet := CONCAT( string1 , string2 );

 CONCATは 文字列string1 に 文字列string2 の連結結果の文字列を返します。

  VARCHAR2 での文字列の連結の最大サイズは 4000 バイトでこれを超えるとエラーが発生します。
以下に CONCAT 関数の簡単な例を示します。
SQL> SELECT
  2   CONCAT('あああああ', 'いいい')
  3  ,CONCAT(担当者名, '様')
  4  FROM TM_担当者;

CONCAT('あああああ','いいい')    CONCAT(担当者名,'様')
-------------------------------- ------------------------------------
あああああいいい                 斎藤様
あああああいいい                 山田様
あああああいいい                 田中様
あああああいいい                 島田様
あああああいいい                 鈴木様
あああああいいい                 田村様
あああああいいい                 山下様
あああああいいい                 山村様
あああああいいい                 多田様

9行が選択されました。


以下に文字列長のエラーを発生させてみました。
CHAR_REPEAT ユーザ関数は LPAD, RPAD 関数の説明の中で、作成したユーザ関数です。

SQL> SELECT
  2   CONCAT(CHAR_REPEAT('9', 4000), '0')
  3  FROM DUAL;
FROM DUAL
     *
行3でエラーが発生しました。:
ORA-01489: 文字列を連結した結果、長さが最大長を超えました


CONCAT 関数は引数が2個しか持たないので、3個以上にする場合は入れ子で使用します。
文字列連結の演算子としては 「||」 が在りますので、こちらを使う方が一般的と思います。 この CONCAT 関数は他のSQLにも存在するのですが 「||」 は無いこともありますので 互換性の意味で存在しているのかも知れません。

SQL> SELECT
  2   'あああああ' || 'いいい'
  3  ,担当者名 || '様'
  4  ,CONCAT( CONCAT('あ', 'い'), 'う' )
  5  FROM TM_担当者;

'あああああ'||'いいい'           担当者名||'様'                       CONCAT(CONCA
-------------------------------- ------------------------------------ ------------
あああああいいい                 斎藤様                               あいう
あああああいいい                 山田様                               あいう
あああああいいい                 田中様                               あいう
あああああいいい                 島田様                               あいう
あああああいいい                 鈴木様                               あいう
あああああいいい                 田村様                               あいう
あああああいいい                 山下様                               あいう
あああああいいい                 山村様                               あいう
あああああいいい                 多田様                               あいう

9行が選択されました。

■引数が複数(10個まで)の CONCAT 関数


CONCAT 関数は引数が2個しか持たないので、10個まで可能な様なファンクションを作成してみました。

このファンクションは、3番目以降のデフォルト引き数を空白文字で宣言しています。
処理としてはすべての引数を順番に結合したものを返すだけの単純な処理を行っています。
DECODE 関数は引数が可変なのですが、内部的にどの様に処理しているのかはわかりません。この関数では適当な感じで作成してみました)

使用した例も表示します。

SQL> CREATE OR REPLACE FUNCTION CONCATEX (
  2      InChar1     IN  VARCHAR2
  3     ,InChar2     IN  VARCHAR2
  4     ,InChar3     IN  VARCHAR2 DEFAULT ''
  5     ,InChar4     IN  VARCHAR2 DEFAULT ''
  6     ,InChar5     IN  VARCHAR2 DEFAULT ''
  7     ,InChar6     IN  VARCHAR2 DEFAULT ''
  8     ,InChar7     IN  VARCHAR2 DEFAULT ''
  9     ,InChar8     IN  VARCHAR2 DEFAULT ''
 10     ,InChar9     IN  VARCHAR2 DEFAULT ''
 11     ,InChar10    IN  VARCHAR2 DEFAULT ''
 12  )
 13  RETURN VARCHAR2
 14  IS
 15      strWk  VARCHAR2(4000);
 16  BEGIN
 17      strWk := strWk || InChar1;
 18      strWk := strWk || InChar2;
 19      strWk := strWk || InChar3;
 20      strWk := strWk || InChar4;
 21      strWk := strWk || InChar5;
 22      strWk := strWk || InChar6;
 23      strWk := strWk || InChar7;
 24      strWk := strWk || InChar8;
 25      strWk := strWk || InChar9;
 26      strWk := strWk || InChar10;
 27
 28      RETURN  strWk;
 29  END;
 30  /

ファンクションが作成されました。

SQL> SELECT
  2    CONCATEX('あ', 'い' )
  3   ,CONCATEX('あ', 'い', 'う' )
  4   ,CONCATEX('あ', 'い', 'う', 'え' )
  5   ,CONCATEX('あ', 'い', 'う', 'え', 'お' )
  6  FROM DUAL;

CONCATEX('あ','い')
------------------------------------------------------------------
CONCATEX('あ','い','う')
------------------------------------------------------------------
CONCATEX('あ','い','う','え')
------------------------------------------------------------------
CONCATEX('あ','い','う','え','お')
------------------------------------------------------------------
あい
あいう
あいうえ
あいうえお