В 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.