Разбить несколько разделенных запятыми столбцов на строки - PullRequest
0 голосов
/ 23 мая 2018

У меня есть одна таблица (SQL Server), в которой значения разделены запятыми в нескольких столбцах, как показано ниже:

Rule_ID    ListType_ID    Values
1          1,2            100,200
2          3,4            300,400

Я хочу разделить значения, разделенные запятыми, и преобразовать их в строки.

Требуемый вывод должен быть таким, как показано ниже:

Rule_ID    ListType_ID    Values
1          1              100
1          2              200
2          3              300
2          4              400

Я пробовал следующий запрос:

DECLARE @TEMP AS TABLE (
    [Rule_ID] INT,
    [ListType_ID] VARCHAR(MAX),
    [Values] VARCHAR(MAX)
)

INSERT INTO @TEMP
SELECT 1, '1,2', '100,200'
UNION ALL
SELECT 2, '3,4', '300,400' 

SELECT 
    [Rule_ID],
    PARSENAME(REPLACE(Split1.b.value('.', 'VARCHAR(100)'),'-','.'),1) AS [ListType_ID],
    PARSENAME(REPLACE(Split.a.value('.', 'VARCHAR(100)'),'-','.'),1) AS [Values] 
FROM  
(
    SELECT [Rule_ID],
    CAST ('<M>' + REPLACE([ListType_ID], ',', '</M><M>') + '</M>' AS XML) AS [ListType_ID],
    CAST ('<M>' + REPLACE([Values], ',', '</M><M>') + '</M>' AS XML) AS [Values] 
    FROM @TEMP     
) AS A 
CROSS APPLY [Values].nodes ('/M') AS Split(a)
CROSS APPLY [ListType_ID].nodes ('/M') AS Split1(b)
ORDER BY [Rule_ID], [ListType_ID], [Values]

Этот запрос возвращает приведенный ниже вывод, который отличается оттребуемый вывод:

Rule_ID    ListType_ID    Values
1          1              100
1          1              200
1          2              100
1          2              200
2          3              300
2          3              400
2          4              300
2          4              400

Пожалуйста, помогите мне здесь .... !!!!

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Используя CTE, двойное CROSS APPLY и XML-разделение, вы можете использовать этот скрипт:

;WITH Splitted AS 
( 
    SELECT    
        [Rule_ID]
        ,CAST('<x>' + REPLACE([ListType_ID],',','</x><x>') + '</x>' AS XML) AS  [ListType_ID_Val]    
        ,CAST('<x>' + REPLACE([Values],',','</x><x>') + '</x>' AS XML) AS  [Values_Val]    
    FROM @TEMP 
) 
SELECT     
    Rule_ID, cs.VAL as[ListType_ID], cd.VAL as [Values]
FROM Splitted
    CROSS APPLY (VALUES ('a',ListType_ID_Val.value(N'/x[1]','int') ),
      ('b',ListType_ID_Val.value(N'/x[2]','int') )
    )CS (COL,VAL) 
     CROSS APPLY (VALUES ('a',Values_Val.value(N'/x[1]','int') ),
      ('b',Values_Val.value(N'/x[2]','int') )
    )CD (COL,VAL) 
where CS.COL = CD.COL

Результаты:

enter image description here

0 голосов
/ 23 мая 2018

Пожалуйста, проверьте следующий сценарий SQL

Чтобы разделить строку в SQL, я использовал одну из следующих пользовательских Функции разделения строки SQL

Эти функции возвращают порядокразделенная строка, которую я использовал в предложении WHERE, чтобы я мог сопоставить значения полей один к одному

/*
create table Table_1 (
    Rule_ID int,    ListType_ID    varchar(max), [Values] varchar(max)
)
insert into Table_1 select 1,'1,2','100,200'
insert into Table_1 select 2,'3,4','300,400'
*/
select 
Rule_ID,
idlist.val as ListType_ID,
valueslist.val as [Values]
from Table_1
cross apply dbo.SPLIT(ListType_ID,',') as idlist
cross apply dbo.SPLIT([Values],',') as valueslist
where 
idlist.id = valueslist.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...