При работе с данными в SQL Server часто возникают ситуации, когда вам необходимо разделить строку на несколько частей. Это может быть полезно, например, при работе со значениями, разделенными запятыми, или при извлечении определенных частей строки. В этой статье мы рассмотрим несколько методов разделения строк в SQL Server, приведя примеры кода для каждого подхода.
Метод 1: использование функции STRING_SPLIT (SQL Server 2016 и более поздних версий)
В SQL Server 2016 появилась функция STRING_SPLIT, которая упрощает процесс разделения строк на таблицу значений. Он принимает два параметра: входную строку и разделитель. Вот пример:
DECLARE @inputString VARCHAR(100) = 'apple,banana,cherry';
SELECT value FROM STRING_SPLIT(@inputString, ',');
Метод 2: использование XML и CROSS APPLY
Другой распространенный метод разделения строк включает использование функций XML в сочетании с оператором CROSS APPLY. Этот подход подходит для версий до SQL Server 2016. Вот пример:
DECLARE @inputString VARCHAR(100) = 'apple,banana,cherry';
SELECT Split.a.value('.', 'VARCHAR(100)') AS Value
FROM (SELECT CAST('<X>' + REPLACE(@inputString, ',', '</X><X>') + '</X>' AS XML)) AS A
CROSS APPLY A.nodes('/X') AS Split(a);
Метод 3: использование таблицы чисел
Если у вас нет доступа к SQL Server 2016 или более поздней версии и XML невозможен, вы можете создать таблицу чисел, чтобы разделить строку. Таблица чисел — это простая таблица с последовательными номерами. Вот пример:
DECLARE @inputString VARCHAR(100) = 'apple,banana,cherry';
SELECT SUBSTRING(@inputString, number, CHARINDEX(',', @inputString + ',', number) - number) AS Value
FROM numbers
WHERE number <= LEN(@inputString)
AND SUBSTRING(',' + @inputString, number, 1) = ',';
Метод 4: использование рекурсивного CTE (общего табличного выражения)
Рекурсивный CTE также можно использовать для разделения строк в SQL Server. Этот метод подходит для версий до SQL Server 2016. Вот пример:
DECLARE @inputString VARCHAR(100) = 'apple,banana,cherry';
WITH SplitCTE AS (
SELECT
LEFT(@inputString, CHARINDEX(',', @inputString) - 1) AS Value,
RIGHT(@inputString, LEN(@inputString) - CHARINDEX(',', @inputString)) AS RemainingString
UNION ALL
SELECT
LEFT(RemainingString, CHARINDEX(',', RemainingString + ',') - 1),
RIGHT(RemainingString, LEN(RemainingString) - CHARINDEX(',', RemainingString))
FROM SplitCTE
WHERE LEN(RemainingString) > 0
)
SELECT Value FROM SplitCTE;
В этой статье мы рассмотрели различные методы разделения строк в SQL Server. Мы рассмотрели функцию STRING_SPLIT, XML и CROSS APPLY, таблицу чисел и рекурсивный CTE. В зависимости от вашей версии SQL Server и конкретных требований вы можете выбрать наиболее подходящий подход для ваших нужд разделения строк.