kirthiga S Ответов: 3

Как разбить строку с помощью разделителя в Sql


Привет,

У меня есть таблица с именем места, разделенным разделителем.
Я хочу разделить название мест отдельно на основе разделителя.
Как добиться этого с помощью запроса?

Пример:

create table #place(Places varchar(100))
insert into #place values('Chennai, Banglore, Mumbai, Calcutta')

select Places,Substring(Places,0,charindex(',',Places))Place1
,Substring(Places,charindex(',',Places)+2,LEN(Places)-charindex(',',Places))Place2
from #place


Для моего запроса выводится следующее

Places	                              Place1	Place2
Chennai, Banglore, Mumbai, Calcutta   Chennai	Banglore, Mumbai, Calcutta


Мой требуемый результат таков

Places	                             Place1	Place2	 Place3	Place4
Chennai, Banglore, Mumbai, Calcutta  Chennai	Banglore Mumbai	Calcutta

3 Ответов

Рейтинг:
16

Maciej Los

На основе этого решения: Эффективный способ разделения строк с помощью cte[^], я сделал


DECLARE @place TABLE(ID INT IDENTITY(1,1), Places varchar(100))
insert into @place (Places) values('Chennai, Banglore, Mumbai, Calcutta')
insert into @place (Places) values('Warsow, Moskow, Berlin, Prague')
insert into @place (Places) values('City1, City2, City3, City4')

;WITH SplitSting AS
(
    SELECT
        ID,LEFT(Places,CHARINDEX(',',Places)-1) AS Part
            ,RIGHT(Places,LEN(Places)-CHARINDEX(',',Places)) AS Remainder
        FROM @place
        WHERE Places IS NOT NULL AND CHARINDEX(',',Places)>0
    UNION ALL
    SELECT
        ID,LEFT(Remainder,CHARINDEX(',',Remainder)-1)
            ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(',',Remainder))
        FROM SplitSting
        WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)>0
    UNION ALL
    SELECT
        ID,Remainder,null
        FROM SplitSting
        WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)=0
)
SELECT * FROM SplitSting ORDER BY ID


Результат:

ИДЕНТИФИКАТОР Часть Остаток
1 Ченнаи Банглор, Мумбаи, Калькутта
1 Бангалор Мумбаи, Калькутта
1 Мумбаи Калькутта
1 Калькутта НУЛЕВОЙ
2 Москва Берлин, Прага
2 Берлин Прага
2 Прага НУЛЕВОЙ
2 Варшава Москва, Берлин, Прага
3 Городе1 City2, City3, City4
3 М2 М3, City4
3 М3 City4
3 City4 НУЛЕВОЙ


Рейтинг:
0

Karruksen

SELECT Places,"place1"=SUBSTRING(places,1,7),"place2"=SUBSTRING(places,9,8)
,"place3"=SUBSTRING(places,19,6),"place4"=SUBSTRING(Places,27,6)  FROM 

Output:

Place                                   place1   place2          place3   place4
Chennai, Banglore, Mumbai, Calcutta	Chennai	 Banglore	 Mumbai	 Calcutta


kirthiga S

Привет Карруксен,
Здесь позиции даются вручную. Для одного ряда это нормально. Для нескольких строк с различным положением разделителя мне нужен запрос.