SQL Split String на char, а затем разделить каждый на отдельные символы () как представление или просто выбрать - PullRequest
0 голосов
/ 06 октября 2018

У меня есть столбец данных, который выглядит следующим образом:

xy w12,jwwx  , mpp w,a n p ,234567

Обратите внимание, что элементы представляют собой csv, который достаточно легко разделить;однако у меня есть некоторые другие требования, делающие это более трудным.

Мне нужно, чтобы разделенные строки (включая любые пробелы от запятой до запятой) были в строках.

Конечно, последнее требование заключается в том, чтобыкаждая из этих строк также может быть разбита на столбцы символов, включая пробелы и по порядку.(максимум никогда не будет больше 8 символов)

Мне нужно создать строку данных для каждого разбиения, которая выглядит как

             char(1) | Char(2) | char(3) | char(4) | char(5) | char(6) | char(7) | char(8)

row1:            x        y                   w         1        2

row2:            j        w         w         x

row3:                     m         p         p                  w

row4:           a                   n                   p

row5:           2         3         4         5         6        7  

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Просто еще один вариант с использованием небольшого XML и CROSS APPLY

Пример

Declare @YourTable table (id int,SomeCol varchar(max))
Insert Into @YourTable values
(1,'xy w12,jwwx  , mpp w,a n p ,234567')

Select A.ID
      ,char1 = substring(RetVal,1,1)
      ,char2 = substring(RetVal,2,1)
      ,char3 = substring(RetVal,3,1)
      ,char4 = substring(RetVal,4,1)
      ,char5 = substring(RetVal,5,1)
      ,char6 = substring(RetVal,6,1)
      ,char7 = substring(RetVal,7,1)
      ,char8 = substring(RetVal,8,1)
 From  @YourTable A
 Cross Apply (
                Select RetSeq = Row_Number() over (Order By (Select null))
                      ,RetVal = B.i.value('(./text())[1]', 'varchar(max)')
                From  (Select x = Cast('<x>' + replace((Select replace(SomeCol,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                Cross Apply x.nodes('x') AS B(i)
             ) B

Возвращает

ID  char1   char2   char3   char4   char5   char6   char7   char8
1   x       y               w       1       2       
1   j       w       w       x                       
1           m       p       p               w       
1   a               n               p               
1   2       3       4       5       6       7       
0 голосов
/ 06 октября 2018

Если я правильно понимаю, вам просто нужна функция substring() (которая также может идти до substr() в некоторых базах данных):

select substring(col, 1, 1) as char_1,
       substring(col, 2, 1) as char_2,
       . . .
       substring(col, 8, 1) as char_8
from t;

РЕДАКТИРОВАТЬ:

Выше предполагается, чтоСтроки находятся в отдельных рядах, что имеет для меня гораздо больше смысла.Предполагая, что запятые не являются допустимыми символами, используйте string_split() (или связанную функцию, которую вы можете легко найти в Интернете):

select substring(str, 1, 1) as char_1,
       substring(str, 2, 1) as char_2,
       . . .
       substring(str, 8, 1) as char_8
from t cross apply
     string_split(t.data, ',') ss(str);
...