В 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 вы можете выбрать наиболее подходящий метод для эффективного выполнения преобразования.