Я столкнулся с подобной проблемой, но сложной, и так как это первый поток, который я нашел по этой проблеме, я решил опубликовать свое сообщение. Я знаю, что это сложное решение простой проблемы, но я надеюсь, что я могу помочь другим людям, которые идут в эту тему, ищут более сложное решение. Мне пришлось разбить строку, содержащую 5 чисел (имя столбца: levelsFeed) и показать каждое число в отдельном столбце. например: 8,1,2,2,2 следует указывать как:
1 2 3 4 5
-------------
8 1 2 2 2
Решение 1: использование функций XML: это решение для самого медленного решения на самом деле
SELECT Distinct FeedbackID,
, S.a.value('(/H/r)[1]', 'INT') AS level1
, S.a.value('(/H/r)[2]', 'INT') AS level2
, S.a.value('(/H/r)[3]', 'INT') AS level3
, S.a.value('(/H/r)[4]', 'INT') AS level4
, S.a.value('(/H/r)[5]', 'INT') AS level5
FROM (
SELECT *,CAST (N'<H><r>' + REPLACE(levelsFeed, ',', '</r><r>') + '</r> </H>' AS XML) AS [vals]
FROM Feedbacks
) as d
CROSS APPLY d.[vals].nodes('/H/r') S(a)
Решение 2: использование функции разделения и поворота. (функция разделения разделяет строку на строки с именем столбца Data)
SELECT FeedbackID, [1],[2],[3],[4],[5]
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY feedbackID ORDER BY (SELECT null)) as rn
FROM (
SELECT FeedbackID, levelsFeed
FROM Feedbacks
) as a
CROSS APPLY dbo.Split(levelsFeed, ',')
) as SourceTable
PIVOT
(
MAX(data)
FOR rn IN ([1],[2],[3],[4],[5])
)as pivotTable
Решение 3: использование функций строковых манипуляций - быстрее всего с небольшим отрывом над решением 2
SELECT FeedbackID,
SUBSTRING(levelsFeed,0,CHARINDEX(',',levelsFeed)) AS level1,
PARSENAME(REPLACE(SUBSTRING(levelsFeed,CHARINDEX(',',levelsFeed)+1,LEN(levelsFeed)),',','.'),4) AS level2,
PARSENAME(REPLACE(SUBSTRING(levelsFeed,CHARINDEX(',',levelsFeed)+1,LEN(levelsFeed)),',','.'),3) AS level3,
PARSENAME(REPLACE(SUBSTRING(levelsFeed,CHARINDEX(',',levelsFeed)+1,LEN(levelsFeed)),',','.'),2) AS level4,
PARSENAME(REPLACE(SUBSTRING(levelsFeed,CHARINDEX(',',levelsFeed)+1,LEN(levelsFeed)),',','.'),1) AS level5
FROM Feedbacks
так как levelFeed содержит 5 строковых значений, которые мне нужны для использования функции подстроки для первой строки.
Надеюсь, что мое решение поможет другим, кто попал в эту тему, искать более сложные методы разделения столбцов