Вы можете разобрать строки с помощью XML
функциональность:
;WITH cte AS (SELECT testString = 'element1|value,element2|value2,element3|value3'
UNION SELECT 'test,1,2,3'
)
,SplitString AS (SELECT testString,
CONVERT(XML,'<String><Section>'+ REPLACE(REPLACE(testString ,'|',','),',', '</Section><Section>') + '</Section></String>') AS xmlString
FROM cte
)
SELECT xmlString.value('/String[1]/Section[1]','varchar(100)') AS Col1
,xmlString.value('/String[1]/Section[2]','varchar(100)') AS Col2
,xmlString.value('/String[1]/Section[3]','varchar(100)') AS Col3
,xmlString.value('/String[1]/Section[4]','varchar(100)') AS Col4
FROM SplitString
Здесь я просто изменил ваш |
в ,
и сделать все расщеплению одним махом, но если это не все даже пары вы могли бы это сделать в два этапа, сначала расщепление на |
, затем на ,
.
Вы также можете посмотреть в PARSENAME()
, но он ограничен 4 разделов, или вы можете создать PARSE
функцию, как:
/********************************************************************************************
Create Parse Function
********************************************************************************************/
CREATE FUNCTION dbo.FN_PARSE(@chunk VARCHAR(4000), @delimiter CHAR(1), @index INT)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE
@curIndex INT = 0,
@pos INT = 1,
@prevPos INT = 0,
@result VARCHAR(1000)
WHILE @pos > 0
BEGIN
SET @pos = CHARINDEX(@delimiter, @chunk, @prevPos);
IF(@pos > 0)
BEGIN -- Characters between position and previous position
SET @result = SUBSTRING(@chunk, @prevPos, @[email protected])
END
ELSE
BEGIN -- Last Delim
SET @result = SUBSTRING(@chunk, @prevPos, LEN(@chunk))
END
IF(@index = @curIndex)
BEGIN
RETURN @result
END
SET @prevPos = @pos + 1
SET @curIndex = @curIndex + 1;
END
RETURN '' -- Else Empty
END
, который затем называется просто:
;WITH cte AS (SELECT testString = 'element1|value,element2|value2,element3|value3'
UNION SELECT 'test,1,2,3'
)
SELECT dbo.FN_PARSE(testString ,'|', 0) AS Col1
,dbo.FN_PARSE(testString ,'|', 1) AS Col2
...
FROM cte
Обратите внимание на индексирование для секции начинается с 0
в вышеуказанной функции.
В настоящее время я заинтересован в версии XML
, но не провел много сравнительного тестирования.
Нужно ли это делать в SQL? SQL не предназначен для разделения строк. Есть ли еще один слой, который мог бы выполнить синтаксический анализ? –
@DStanley Вы не представляете, насколько я желаю, чтобы это было возможно где-то еще. – DidIReallyWriteThat
Является ли ваш желаемый результат несколькими рядами на входную строку, например, ваш образец? –