跳到主要内容

CONCAT_WS

描述

CONCAT_WS 函数(Concatenate With Separator)用于使用指定的分隔符连接多个字符串或数组。与 CONCAT 函数不同,CONCAT_WS 会自动跳过 NULL 值(但不跳过空字符串),并在非 NULL 值之间插入分隔符。该函数支持字符串参数和数组参数两种模式,在生成 CSV 格式、路径拼接、标签列表等场景中非常有用。

语法

-- 字符串模式
CONCAT_WS(<sep>, <str> [, <str> ...])

-- 数组模式
CONCAT_WS(<sep>, <array> [, <array> ...])

参数

参数说明
<sep>分隔符字符串,用于连接各个部分。类型:VARCHAR
<str>待连接的字符串参数。类型:VARCHAR
<array>待连接的数组参数,数组元素必须为字符串类型。类型:ARRAY<VARCHAR>

返回值

返回 VARCHAR 类型,表示使用分隔符连接后的字符串。

连接规则:

  • 使用第一个参数作为分隔符连接后续参数
  • 自动跳过 NULL 值,但保留空字符串
  • 支持字符串参数或数组参数,但不能混合使用
  • 支持 UTF-8 多字节字符作为分隔符和内容

特殊情况:

  • 如果分隔符为 NULL,返回 NULL
  • 如果所有待连接的参数都是 NULL,返回空字符串
  • 数组模式中,跳过数组中的 NULL 元素,但保留空字符串元素
  • 多个数组参数中包含 NULL 数组时,返回空字符串
  • 不允许字符串参数和数组参数混合使用

示例

  1. 基本字符串连接
SELECT CONCAT_WS(',', 'apple', 'banana', 'orange'), CONCAT_WS('-', 'hello', 'world');
+-------------------------------------------+----------------------------------+
| CONCAT_WS(',', 'apple', 'banana', 'orange') | CONCAT_WS('-', 'hello', 'world') |
+-------------------------------------------+----------------------------------+
| apple,banana,orange | hello-world |
+-------------------------------------------+----------------------------------+
  1. 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 |
+----------------------------+----------------------------------+
  1. 空字符串处理(保留空字符串)
SELECT CONCAT_WS('|', 'hello', '', 'world', NULL), CONCAT_WS(',', '', 'test', '');
+--------------------------------------------+-------------------------------+
| CONCAT_WS('|', 'hello', '', 'world', NULL) | CONCAT_WS(',', '', 'test', '') |
+--------------------------------------------+-------------------------------+
| hello||world | ,test, |
+--------------------------------------------+-------------------------------+
  1. 全部为 NULL 的情况
SELECT CONCAT_WS('x', NULL, NULL), CONCAT_WS('-', NULL, NULL, NULL);
+----------------------------+---------------------------------+
| CONCAT_WS('x', NULL, NULL) | CONCAT_WS('-', NULL, NULL, NULL) |
+----------------------------+---------------------------------+
| | |
+----------------------------+---------------------------------+
  1. 数组模式基本用法
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 |
+------------------------------+--------------------------------------------+
  1. 数组中的 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 |
+------------------------------------+------------------------------------------+
  1. 多个数组连接
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 |
+------------------------------------------------+----------------------------------+
  1. 多个数组中包含 NULL 数组
SELECT CONCAT_WS('-', ['a', 'b'], NULL, ['c', NULL], ['d']);
+-----------------------------------------------------+
| CONCAT_WS('-', ['a', 'b'], NULL, ['c', NULL], ['d']) |
+-----------------------------------------------------+
| |
+-----------------------------------------------------+
  1. UTF-8 多字节字符处理
SELECT CONCAT_WS('x', 'ṭṛì', 'ḍḍumai'), CONCAT_WS('→', ['ṭṛì', 'ḍḍumai', 'hello']);
+-------------------------------+----------------------------------------------+
| CONCAT_WS('x', 'ṭṛì', 'ḍḍumai') | CONCAT_WS('→', ['ṭṛì', 'ḍḍumai', 'hello']) |
+-------------------------------+----------------------------------------------+
| ṭṛìxḍḍumai | ṭṛì→ḍḍumai→hello |
+-------------------------------+----------------------------------------------+
  1. 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 |
+------------------------------------+--------------------------------------------------------+