Освоение разделения строк, разделенных запятыми, в SQL Server: руководство с примерами кода

В SQL Server разделение строки, разделенной запятыми, на отдельные значения — обычная задача, с которой сталкиваются разработчики и администраторы баз данных. В этой статье блога вы познакомитесь с несколькими методами, позволяющими сделать это в простой и понятной форме. Мы рассмотрим различные подходы, включая встроенные функции, определяемые пользователем функции и даже некоторые творческие приемы. Итак, давайте углубимся и освоим искусство разделения строк в SQL Server!

Метод 1: использование функции STRING_SPLIT
Функция STRING_SPLIT, представленная в SQL Server 2016, обеспечивает простой способ разделения строки на основе указанного разделителя. Вот пример:

DECLARE @inputString VARCHAR(100) = 'apple,banana,grape,orange'
SELECT value FROM STRING_SPLIT(@inputString, ',')

Метод 2: использование XML и CROSS APPLY
Другой эффективный метод включает преобразование строки, разделенной запятыми, в XML, а затем использование оператора CROSS APPLY для извлечения отдельных значений. Вот пример:

DECLARE @inputString VARCHAR(100) = 'apple,banana,grape,orange'
SELECT Split.a.value('.', 'VARCHAR(100)') AS Value
FROM (SELECT TRY_CAST('<X>'+REPLACE(@inputString, ',', '</X><X>')+'</X>' AS XML) AS String) AS A
CROSS APPLY String.nodes('/X') AS Split(a)

Метод 3: использование рекурсивного общего табличного выражения (CTE)
Рекурсивный CTE позволяет итеративно разбивать строку, многократно извлекая подстроку перед разделителем. Вот пример:

DECLARE @inputString VARCHAR(100) = 'apple,banana,grape,orange'
;WITH SplitCTE AS (
    SELECT
        LEFT(@inputString, CHARINDEX(',', @inputString + ',') - 1) AS Value,
        STUFF(@inputString, 1, CHARINDEX(',', @inputString + ','), '') AS Remaining
    UNION ALL
    SELECT
        LEFT(Remaining, CHARINDEX(',', Remaining + ',') - 1),
        STUFF(Remaining, 1, CHARINDEX(',', Remaining + ','), '')
    FROM SplitCTE
    WHERE LEN(Remaining) > 0
)
SELECT Value FROM SplitCTE

Метод 4: использование пользовательской функции (UDF)
Если вам часто приходится разбивать строки в среде SQL Server, создание пользовательской функции может быть удобным решением. Вот пример простой пользовательской функции для разделения строк:

CREATE FUNCTION dbo.SplitString (
    @inputString VARCHAR(MAX),
    @delimiter CHAR(1)
)
RETURNS @outputTable TABLE (Value VARCHAR(MAX))
AS
BEGIN
    DECLARE @value VARCHAR(MAX)
    WHILE CHARINDEX(@delimiter, @inputString) > 0
    BEGIN
        SET @value = SUBSTRING(@inputString, 1, CHARINDEX(@delimiter, @inputString) - 1)
        INSERT INTO @outputTable (Value) VALUES (@value)
        SET @inputString = SUBSTRING(@inputString, CHARINDEX(@delimiter, @inputString) + 1, LEN(@inputString))
    END
    INSERT INTO @outputTable (Value) VALUES (@inputString)
    RETURN
END

Разделение строк, разделенных запятыми, в SQL Server может осуществляться различными методами, каждый из которых имеет свои преимущества. В этой статье мы рассмотрели встроенную функцию STRING_SPLIT, преобразование XML с помощью CROSS APPLY, рекурсивный CTE и пользовательские функции. В зависимости от ваших конкретных требований и предпочтений вы можете выбрать наиболее подходящий подход для вашего сценария. Теперь, когда вы хорошо разбираетесь в этих методах, вы можете уверенно манипулировать и обрабатывать строки, разделенные запятыми, в своих проектах SQL Server.