Перейти к содержимому
Последнее обновление

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, возвращается пустая строка
  • Смешивать строковые аргументы и аргументы в виде массивов не допускается

Примеры​

  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 |
+------------------------------------+--------------------------------------------------------+