Podział ciągu tekstu w kolumnach

0

Witam,

W MS SQL Server chciałbym podzielić ciąg tekstu z dwóch kolumn jednocześnie. Przykładowo ma tabelę o następujących rekordach:
('Książka', 'a,b,c', 'A,B,C'),
('Zeszyt', 'a,b', 'A,B'),
('Ołówek', 'a', 'A').

Chciałbym podzielić kolumny 2 i 3 za pomocą znacznika jakim jest "," i otrzymać coś takiego:
('Książka', 'a', 'A'),
('Książka', 'b', 'B'),
('Książka', 'c', 'C'),
('Zeszyt', 'a', 'A'),
('Zeszyt', 'b', 'B'),
('Ołówek', 'a', 'A').

Niestety nigdzie nie mogę znaleźć funkcji, która dzieliła by tekst dla dwóch kolumn jednocześnie. Proszę o pomoc.
Z góry dzięki :)

0

A w starszym oprogramowaniu niż MS SQL 2016, gdzie funkcja STRING_SPLIT nie działa ?

3

Od wersji 2005 możesz wykorzystać to: https://stackoverflow.com/questions/951401/sql-2005-split-comma-separated-column-on-delimiter

Czyli tworzysz funkcje:

create function [dbo].[Split] (@list nvarchar(max), @delimiter nchar(1) = N',')
returns table
as
return (
  select 
    Number = row_number() over (order by Number)
  , [Value] = ltrim(rtrim(convert(nvarchar(4000),
        substring(@list, Number
        , charindex(@delimiter, @list+@delimiter, Number)-Number
        )
    )))
  from (select * from master..spt_values where type='p') Numbers
  where Number <= convert(int, len(@list))
    and substring(@delimiter + @list, Number, 1) = @delimiter
  )

To wyciągniesz to takim zapytaniem:

with cP2 as (
select 
    p1
    , Number 
    , value p2 
from 
    d
    cross apply [dbo].[Split](d.p2,',')
), cP3 as (
select 
    p1
    , Number 
    , value p3 
from 
    d
    cross apply [dbo].[Split](d.p3,',')
)

select
    cP2.p1
    ,p2
    ,P3
from
    cP2
    inner join cP3 on cP2.p1=cP3.p1 and cP2.Number = cP3.Number 

Oczywiście sam join wymaga dopracowania, bo zakładam, że liczba elementów jest zawsze taka sama w polach p2,p3, ale na początek pozwoli Ci wystartować:

http://www.sqlfiddle.com/#!18/aa5f8/1

0

Wow. Wielkie dzięki Panczo :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1