に最終更新
CONCAT_WS
説明
CONCAT_WS 関数(区切り文字付き連結)は、指定した区切り文字で複数の文字列または配列を連結します。CONCAT 関数とは異なり、CONCAT_WS は NULL 値を自動的にスキップしますが、空文字列はスキップせず、NULL 以外の値の間に区切り文字を挿入します。この関数は文字列引数モードと配列引数モードの両方に対応し、CSV 形式の生成、パスの結合、タグ一覧の作成などに役立ちます。
構文
-- String mode
CONCAT_WS(<sep>, <str> [, <str> ...])
-- Array mode
CONCAT_WS(<sep>, <array> [, <array> ...])
パラメータ
| パラメータ | 説明 |
|---|---|
<sep> | 必須。値を連結する際に使用する区切り文字列。型: VARCHAR |
<str> | 文字列引数モードで連結する文字列。先頭の引数は必須で、後続の引数は省略可能。型: VARCHAR |
<array> | 配列引数モードで連結する配列。先頭の引数は必須で、後続の引数は省略可能。配列の要素は文字列型である必要があります。型: ARRAY<VARCHAR> |
戻り値
区切り文字で連結された文字列を表す VARCHAR 型の値を返します。
連結規則:
- 最初の引数を区切り文字として使用し、後続の引数を連結します
- NULL 値は自動的にスキップしますが、空文字列は保持します
- 文字列引数または配列引数を使用できますが、両者を混在させることはできません
- 区切り文字と連結対象の両方に UTF-8 のマルチバイト文字を使用できます
特殊なケース:
- 区切り文字が NULL の場合は、NULL を返します
- 連結対象の引数がすべて NULL の場合は、空文字列を返します
- 配列引数モードでは、配列内の NULL 要素をスキップしますが、空文字列の要素は保持します
- 複数の配列引数に NULL 配列が含まれる場合は、空文字列を返します
- 文字列引数と配列引数を混在させることはできません
例
- 基本的な文字列の連結
SELECT CONCAT_WS(',', 'apple', 'banana', 'orange'), CONCAT_WS('-', 'hello', 'world');
+-------------------------------------------+----------------------------------+
| CONCAT_WS(',', 'apple', 'banana', 'orange') | CONCAT_WS('-', 'hello', 'world') |
+-------------------------------------------+----------------------------------+
| apple,banana,orange | hello-world |
+-------------------------------------------+----------------------------------+
- 区切り文字が NULL の場合
SELECT CONCAT_WS(NULL, 'd', 'is'), CONCAT_WS('or', 'd', NULL, 'is');
+----------------------------+----------------------------------+
| CONCAT_WS(NULL, 'd', 'is') | CONCAT_WS('or', 'd', NULL, 'is') |
+----------------------------+----------------------------------+
| NULL | doris |
+----------------------------+----------------------------------+
- 空文字列の扱い(空文字列を保持)
SELECT CONCAT_WS('|', 'hello', '', 'world', NULL), CONCAT_WS(',', '', 'test', '');
+--------------------------------------------+-------------------------------+
| CONCAT_WS('|', 'hello', '', 'world', NULL) | CONCAT_WS(',', '', 'test', '') |
+--------------------------------------------+-------------------------------+
| hello||world | ,test, |
+--------------------------------------------+-------------------------------+
- すべての値が NULL の場合
SELECT CONCAT_WS('x', NULL, NULL), CONCAT_WS('-', NULL, NULL, NULL);
+----------------------------+---------------------------------+
| CONCAT_WS('x', NULL, NULL) | CONCAT_WS('-', NULL, NULL, NULL) |
+----------------------------+---------------------------------+
| | |
+----------------------------+---------------------------------+
- 配列引数モードの基本的な使い方
SELECT CONCAT_WS('or', ['d', 'is']), CONCAT_WS('-', ['apple', 'banana', 'cherry']);
+------------------------------+--------------------------------------------+
| CONCAT_WS('or', ['d', 'is']) | CONCAT_WS('-', ['apple', 'banana', 'cherry']) |
+------------------------------+--------------------------------------------+
| doris | apple-banana-cherry |
+------------------------------+--------------------------------------------+
- 配列内の NULL 値
SELECT CONCAT_WS('or', ['d', NULL, 'is']), CONCAT_WS(',', [NULL, 'a', 'b', NULL, 'c']);
+------------------------------------+------------------------------------------+
| CONCAT_WS('or', ['d', NULL, 'is']) | CONCAT_WS(',', [NULL, 'a', 'b', NULL, 'c']) |
+------------------------------------+------------------------------------------+
| doris | a,b,c |
+------------------------------------+------------------------------------------+
- 複数の配列の連結
SELECT CONCAT_WS('-', ['a', 'b'], ['c', NULL], ['d']), CONCAT_WS('|', ['x'], ['y', 'z']);
+------------------------------------------------+----------------------------------+
| CONCAT_WS('-', ['a', 'b'], ['c', NULL], ['d']) | CONCAT_WS('|', ['x'], ['y', 'z']) |
+------------------------------------------------+----------------------------------+
| a-b-c-d | x|y|z |
+------------------------------------------------+----------------------------------+
- 複数の配列引数に NULL 配列が含まれる場合
SELECT CONCAT_WS('-', ['a', 'b'], NULL, ['c', NULL], ['d']);
+-----------------------------------------------------+
| CONCAT_WS('-', ['a', 'b'], NULL, ['c', NULL], ['d']) |
+-----------------------------------------------------+
| |
+-----------------------------------------------------+
- UTF-8 マルチバイト文字の扱い
SELECT CONCAT_WS('x', 'ṭṛì', 'ḍḍumai'), CONCAT_WS('→', ['ṭṛì', 'ḍḍumai', 'hello']);
+-------------------------------+----------------------------------------------+
| CONCAT_WS('x', 'ṭṛì', 'ḍḍumai') | CONCAT_WS('→', ['ṭṛì', 'ḍḍumai', 'hello']) |
+-------------------------------+----------------------------------------------+
| ṭṛìxḍḍumai | ṭṛì→ḍḍumai→hello |
+-------------------------------+----------------------------------------------+
- CSV 形式の生成とパスの結合
SELECT CONCAT_WS(',', 'Name', 'Age', 'City'), CONCAT_WS('/', 'home', 'user', 'documents', 'file.txt');
+------------------------------------+--------------------------------------------------------+
| CONCAT_WS(',', 'Name', 'Age', 'City') | CONCAT_WS('/', 'home', 'user', 'documents', 'file.txt') |
+------------------------------------+--------------------------------------------------------+
| Name,Age,City | home/user/documents/file.txt |
+------------------------------------+--------------------------------------------------------+