Преобразование списка строк в список целых чисел в SQL Server: изучение различных методов

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

Метод 1: использование функции с табличным значением
Один из способов преобразования списка строк в список целых чисел — создание функции с табличным значением. Этот метод позволяет разделить список строк на отдельные значения, а затем проанализировать и преобразовать их в целые числа. Вот пример того, как создать и использовать такую ​​функцию:

CREATE FUNCTION dbo.StringListToIntList (@StringList VARCHAR(MAX), @Delimiter CHAR(1))
RETURNS @IntList TABLE (Value INT)
AS
BEGIN
    DECLARE @Value VARCHAR(MAX)
    WHILE LEN(@StringList) > 0
    BEGIN
        SET @Value = LEFT(@StringList, ISNULL(NULLIF(CHARINDEX(@Delimiter, @StringList) - 1, -1), LEN(@StringList)))
        SET @StringList = SUBSTRING(@StringList, ISNULL(NULLIF(CHARINDEX(@Delimiter, @StringList), 0), LEN(@StringList)) + 1, LEN(@StringList))
        INSERT INTO @IntList (Value) VALUES (CAST(@Value AS INT))
    END
    RETURN
END

Чтобы использовать функцию, вы можете выполнить следующий запрос:

DECLARE @StringList VARCHAR(MAX) = '1,2,3,4,5'
SELECT * FROM dbo.StringListToIntList(@StringList, ',')

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

DECLARE @StringList VARCHAR(MAX) = '1,2,3,4,5'
SELECT CAST(value AS INT) AS Value
FROM STRING_SPLIT(@StringList, ',')

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

DECLARE @StringList VARCHAR(MAX) = '1,2,3,4,5'
SELECT CAST(t.c.value('.', 'INT') AS INT) AS Value
FROM (SELECT CAST('<t>' + REPLACE(@StringList, ',', '</t><t>') + '</t>' AS XML)) x
CROSS APPLY x.nodes('/t') t(c)

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

DECLARE @StringList VARCHAR(MAX) = '1,2,3,4,5'
;WITH CTE AS (
    SELECT CAST(LEFT(@StringList, ISNULL(NULLIF(CHARINDEX(',', @StringList) - 1, -1), LEN(@StringList)))) AS Value,
           SUBSTRING(@StringList, ISNULL(NULLIF(CHARINDEX(',', @StringList), 0), LEN(@StringList)) + 1, LEN(@StringList)) AS Remaining
    UNION ALL
    SELECT CAST(LEFT(Remaining, ISNULL(NULLIF(CHARINDEX(',', Remaining) - 1, -1), LEN(Remaining)))) AS Value,
           SUBSTRING(Remaining, ISNULL(NULLIF(CHARINDEX(',', Remaining), 0), LEN(Remaining)) + 1, LEN(Remaining)) AS Remaining
    FROM CTE
    WHERE LEN(Remaining) > 0
)
SELECT Value
FROM CTE

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