Komal Dattani Ответов: 2

Разделить строку в SQL server с помощью 2 различных разделителей


У меня есть строка в столбце SQL в приведенной ниже структуре
Date1-Date2=Value1\Date3-Date4=Value2\Date5-Date6=Value3

Хотите получить данные ниже формально

Start Date | End Date | Value 
Date1      | Date2    | Value1
Date3      | Date4    | Value2
Date5      | Date6    | Value3


Пожалуйста помочь

Что я уже пробовал:

Решение добавлено для проблемы ниже

Maciej Los

Что вы пробовали (включая код)?
Насколько я вижу, вам нужно разделить строку на основе набора разделителей: {'\', '-', '='}

2 Ответов

Рейтинг:
8

Komal Dattani

DECLARE @FullString AS NVARCHAR(1000) = 'Date1-Date2=Value1\Date3-Date4=Value2\Date5-Date6=Value3'
	   ;with Data as 
	   (SELECT Split.a.value('.', 'VARCHAR(100)') AS Row  
	   FROM  (SELECT   
       CAST ('<M>' + REPLACE(@FullString, '\', '</M><M>') + '</M>' AS XML) AS String) AS A CROSS APPLY String.nodes ('/M') AS Split(a))
	  select Row, 
	  SUBSTRING(Row,CHARINDEX('-',Row)+1,CHARINDEX('=',Row)-CHARINDEX('-',Row)-1) as EndDate,
	  SUBSTRING(Row,0,CHARINDEX('-',Row)) as StartDate ,
	  SUBSTRING(Row ,CHARINDEX('=', Row)+1, LEN(Row) - CHARINDEX('=', Row)) Value
	  from Data


Рейтинг:
2

Maciej Los

Я бы предложил начать здесь: STRING_SPLIT (Transact-SQL) - SQL Server | Microsoft Docs[^]

[РЕДАКТИРОВАТЬ]
Для более старой версии MS SQL Server (чем 2016) я бы сделал это следующим образом:

DECLARE @t2s AS NVARCHAR(1000) = 'Date1-Date2=Value1\Date3-Date4=Value2\Date5-Date6=Value3'

;WITH MyRows AS
(
	--initial query
	SELECT 1 AS RowNo, LEFT(@t2s, CHARINDEX('\',@t2s)-1) AS RowValue, RIGHT(@t2s, LEN(@t2s) - CHARINDEX('\',@t2s)) AS Remainder
	WHERE CHARINDEX('\',@t2s)>0
	UNION ALL
	--recursive part
	SELECT RowNo +1 AS RowNo, LEFT(Remainder, CHARINDEX('\',Remainder)-1) AS RowValue, RIGHT(@t2s, LEN(Remainder) - CHARINDEX('\',Remainder)) AS Remainder
	FROM MyRows 
	WHERE CHARINDEX('\',Remainder) >0
	UNION ALL
	SELECT RowNo+1 AS RowNo, Remainder AS RowValue, NULL AS Remainder
	FROM MyRows 
	WHERE CHARINDEX('\',Remainder) =0
)
SELECT RowNo, 
	LEFT(RowValue, CHARINDEX('-', RowValue)-1) AS Col1,
	SUBSTRING(RowValue, CHARINDEX('-', RowValue)+1, LEN(RowValue) - CHARINDEX('=', RowValue)-1) AS Col2,
	RIGHT(RowValue, LEN(RowValue)-CHARINDEX('=', RowValue)) AS Col3
FROM MyRows
WHERE CHARINDEX('-', RowValue)>0 AND CHARINDEX('=', RowValue)>0

Результат:
RowNo	Col1	Col2	Col3
1	Date1	Date2	Value1
2	Date3	Date4	Value2
3	Date5	Date6	Value3


Komal Dattani

Не на SQL 2016

Maciej Los

Таким образом, вы должны предоставить дополнительную информацию о версии SQL Server. То, что это твое?

CHill60

STRING_SPLIT был добавлен в SQL Server 2016

Komal Dattani

Спасибо @Мачей Лос это работает, как хорошо

Maciej Los

Всегда пожалуйста.