В этой статье блога мы погрузимся в мир T-SQL (Transact-SQL) и рассмотрим несколько методов разделения строк. Разделение строк является общим требованием при программировании баз данных, и хорошее понимание различных методов может значительно улучшить ваши возможности эффективного манипулирования и анализа данных. Мы предоставим примеры кода для каждого метода, что позволит вам реализовать их в ваших собственных проектах T-SQL. Итак, начнем!
Метод 1: использование функции STRING_SPLIT (SQL Server 2016+):
В SQL Server 2016 появилась функция STRING_SPLIT, которая упрощает процесс разделения строк. Он принимает строку и разделитель в качестве входных данных и возвращает таблицу с каждым значением-разделителем в виде отдельной строки.
Пример кода:
DECLARE @string VARCHAR(100) = 'Apple,Orange,Banana'
SELECT value FROM STRING_SPLIT(@string, ',')
Метод 2. Использование метода XML.
Этот метод включает преобразование строки в XML и последующее использование функций XML для ее разделения. Это полезно при работе со старыми версиями SQL Server, которые не поддерживают функцию STRING_SPLIT.
Пример кода:
DECLARE @string VARCHAR(100) = 'Apple,Orange,Banana'
DECLARE @xml XML
SET @xml = '<root><item>' + REPLACE(@string, ',', '</item><item>') + '</item></root>'
SELECT
T.c.value('.', 'VARCHAR(20)') AS value
FROM @xml.nodes('/root/item') AS T(c)
Метод 3. Использование таблицы чисел.
Этот метод предполагает использование уже существующей таблицы чисел или ее создание на лету. Он разбивает строку, перебирая каждый символ и проверяя разделитель.
Пример кода:
DECLARE @string VARCHAR(100) = 'Apple,Orange,Banana'
DECLARE @delimiter CHAR(1) = ','
DECLARE @numbers TABLE (number INT PRIMARY KEY)
INSERT INTO @numbers (number)
SELECT TOP (LEN(@string)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.columns AS a
CROSS JOIN sys.columns AS b
SELECT
SUBSTRING(@string, n.number, CHARINDEX(@delimiter, @string + @delimiter, n.number) - n.number) AS value
FROM @numbers AS n
WHERE SUBSTRING(@delimiter + @string, n.number, 1) = @delimiter
AND n.number <= LEN(@string) + 1
Метод 4: использование рекурсивного CTE (общее табличное выражение):
Этот метод использует рекурсивный CTE для рекурсивного разделения строки до тех пор, пока не будут извлечены все значения с разделителями.
Пример кода: