CONCAT: примеры (SQL)
CONCAT(string_value1, string_value2 [, n]): stringОсновные сведения о функции CONCAT
Функция CONCAT предназначена для объединения двух и более строковых значений в MS SQL Server. Впервые она была представлена в SQL Server 2012 (версия 11.x). Её использование упрощает сцепление строк по сравнению с оператором +, так как она автоматически преобразует нестроковые аргументы в строковый тип данных и обрабатывает значения NULL как пустые строки.
Функция принимает от 2 до 254 аргументов, которые могут быть любого типа данных. Аргументы неявно преобразуются в строковый тип, если это необходимо. Если все аргументы равны NULL, возвращается строка нулевой длины (типа varchar(1)). Возвращаемый тип данных зависит от типов аргументов: если любой аргумент имеет тип данных SQL-CLR или nvarchar(max), то результатом будет nvarchar(max); иначе, если любой аргумент имеет тип varchar(max), то результатом будет varchar(max). В других случаях результатом будет строковое значение типа, определяемого правилами очередности типов данных.
Базовые примеры использования
Объединение строковых литералов:
SELECT CONCAT('Привет', ', ', 'мир!') AS Result;Result ------------ Привет, мир!
Работа с числами и датами (автоматическое преобразование):
SELECT CONCAT('Заказ №', 125, ' от ', GETDATE()) AS Result;Result -------------------------------------- Заказ №125 от Nov 15 2023 10:30AM
Обработка значений NULL:
SELECT CONCAT('Это', NULL, 'тест') AS Result;Result ------- Этетест
Использование с табличными данными:
SELECT CONCAT(FirstName, ' ', LastName) AS FullName FROM Employees;Альтернативные методы конкатенации в MS SQL
Оператор +: Традиционный метод сцепления строк. Требует явного преобразования типов данных и возвращает NULL, если любой операнд равен NULL (если не установлена настройка CONCAT_NULL_YIELDS_NULL).
Функция CONCAT_WS (доступна с SQL Server 2017): Объединяет строки с указанным разделителем. Первый аргумент — разделитель, последующие — значения для объединения. Игнорирует NULL, но добавляет разделитель между не-NULL значениями.
Функция FORMAT: Может использоваться для сложного форматирования, включая конкатенацию, но менее производительна для простого объединения строк.
Оператор + предпочтителен для простых сценариев без NULL, CONCAT — когда требуется автоматическое преобразование типов и обработка NULL, CONCAT_WS — для объединения с разделителем.
Типичные ошибки и предостережения
Превышение максимального количества аргументов:
-- Попытка передать более 254 аргументов вызовет ошибку
SELECT CONCAT(1,2,3,...,255);Ошибка: The concat function requires 2 to 254 arguments.
Непредвиденные результаты при использовании с датами и специальными типами данных без явного форматирования:
SELECT CONCAT('Дата: ', CAST('2023-12-31' AS datetime)) AS Result;Результат может зависеть от региональных настроек сервера.
Ошибочное предположение о поведении с разделителями (в отличие от CONCAT_WS):
-- CONCAT не добавляет пробелы автоматически
SELECT CONCAT('Иван', 'Иванов') AS FullName;FullName --------- ИванИванов
История изменений функции
Функция CONCAT была введена в SQL Server 2012. Значительных изменений в её синтаксисе или поведении в последующих версиях не было. Однако, начиная с SQL Server 2017, появилась функция CONCAT_WS, которая дополняет возможности CONCAT для сценариев с разделителями.
В SQL Server 2019 и выше, при использовании в режиме совместимости с более новыми версиями, могут быть незначительные оптимизации в плане выполнения запросов с CONCAT.
Расширенные и специализированные примеры
Динамическое построение SQL-запроса:
DECLARE @TableName NVARCHAR(128) = N'Employees';
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = CONCAT(N'SELECT * FROM ', QUOTENAME(@TableName), N' WHERE Active = 1');
-- PRINT @SQL;Объединение строк из столбцов с условием:
SELECT CONCAT(
FirstName,
CASE WHEN MiddleName IS NOT NULL THEN CONCAT(' ', MiddleName) ELSE '' END,
' ',
LastName
) AS FullName FROM Persons;Использование в сочетании с STRING_AGG (SQL Server 2017+):
SELECT DepartmentID,
CONCAT('Сотрудники: ', STRING_AGG(CONCAT(FirstName, ' ', LastName), ', ')) AS EmployeeList
FROM Employees
GROUP BY DepartmentID;Создание строки с разделителями из нескольких столбцов без CONCAT_WS:
SELECT CONCAT(Column1, ',', Column2, ',', Column3) AS CSVLine FROM MyTable;Объединение значений XML:
SELECT CONCAT('<root>', (SELECT * FROM Employees FOR XML PATH('')), '</root>') AS XMLData;Рекурсивное построение пути:
WITH CTE AS (
SELECT 1 AS Level, CONCAT('Level', 1) AS Path
UNION ALL
SELECT Level + 1, CONCAT(Path, ' -> ', 'Level', Level + 1)
FROM CTE WHERE Level < 5
) SELECT * FROM CTE;Функции конкатенации в других СУБД
MySQL: Имеет функцию CONCAT, которая также обрабатывает NULL как пустую строку. Есть CONCAT_WS.
SELECT CONCAT('Hello', NULL, 'World');HelloWorld
Oracle: Использует оператор || или функцию CONCAT, но последняя принимает только два аргумента.
SELECT 'Hello' || ' ' || 'World' FROM dual;Hello World
PostgreSQL: Использует оператор ||. Функция CONCAT игнорирует NULL.
SELECT CONCAT('Hello', NULL, 'World');HelloWorld
SQLite: Использует оператор ||.
Sybase ASE: Использует оператор + и функцию CONCAT (с некоторыми отличиями в поведении с NULL).