Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Galagenka Member Откуда: Сообщений: 14 |
Доброго времени суток!!! Есть таблица, в которой хранятся данные с адресами. Есть ячейка с адресом вида <Индекс,Регион,Область,Город,Населенный пункт,Улица,Дом,Корпус>, нужно разбить данную ячейку на 8 ячеек знак разделения запятая. Как это можно сделать? |
21 янв 13, 11:26 [13801459] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
declare @address table (id int, concat_address varchar(1000)); insert @address values (1, 'Индекс,Регион,Область,Город,Населенный пункт,Улица,Дом,Корпус'); insert @address values (2, 'Индекс 2,Регион 2,Область 2,Город 2, Населенный пункт 2,Улица 2,Дом 2,Корпус 2'); insert @address values (3, 'Индекс 3,Регион 3,Область 3,Город 3,,Улица 3,Дом 3'); insert @address values (4, 'И"н&д<ек''с 4>,,'); insert @address values (5, ''); insert @address values (6, null); insert @address values (7, 'Индекс 7,Регион 7,Область 7,Город 7, Населенный пункт 7,Улица 7,Дом 7,Корпус 7,Неведомая фигня 7'); select a.id, a.concat_address, t.xml_value.value('(/items/item)[1]', 'varchar(1000)') as [Индекс], t.xml_value.value('(/items/item)[2]', 'varchar(1000)') as [Регион], t.xml_value.value('(/items/item)[3]', 'varchar(1000)') as [Область], t.xml_value.value('(/items/item)[4]', 'varchar(1000)') as [Город], t.xml_value.value('(/items/item)[5]', 'varchar(1000)') as [Населенный пункт], t.xml_value.value('(/items/item)[6]', 'varchar(1000)') as [Улица], t.xml_value.value('(/items/item)[7]', 'varchar(1000)') as [Дом], t.xml_value.value('(/items/item)[8]', 'varchar(1000)') as [Корпус] from @address a cross apply ( select cast ( '<items> <item>' + replace ( -- Замена спецсимволов XML replace(replace(replace(a.concat_address, '&', '&'), '>', '>'), '<', '<'), ',', '</item> <item>' ) + '</item> </items>' as xml ) as xml_value ) t |
21 янв 13, 11:57 [13801775] Ответить | Цитировать Сообщить модератору |
Galagenka Member Откуда: Сообщений: 14 |
Спасибо за помощь, получилось как-то так. Можно закрывать --drop table TestTable create table TestTable ( mfid int , fname nvarchar(100) , val nvarchar(100) ) insert into TestTable SELECT distinct mfid,fname,faddress from table select a.mfid, a.fname,NewTable.* from dbo.TestTable a cross apply ( select faddress = val + ',,,,,,,,' ) f1 cross apply ( select p1 = charindex( ',', faddress ) ) p1 cross apply ( select p2 = charindex( ',', faddress, p1 + 1 ) ) p2 cross apply ( select p3 = charindex( ',', faddress, p2 + 1 ) ) p3 cross apply ( select p4 = charindex( ',', faddress, p3 + 1 ) ) p4 cross apply ( select p5 = charindex( ',', faddress, p4 + 1 ) ) p5 cross apply ( select p6 = charindex( ',', faddress, p5 + 1 ) ) p6 cross apply ( select p7 = charindex( ',', faddress, p6 + 1 ) ) p7 cross apply ( select p8 = charindex( ',', faddress, p7 + 1 ) ) p8 cross apply ( select 'Индекс' = substring( faddress, 1, p1-1 ) , 'Регион' = substring( faddress, p1+1, p2-p1-1 ) , 'Район' = substring( faddress, p2+1, p3-p2-1 ) , 'Город' = substring( faddress, p3+1, p4-p3-1 ) , 'Населенный пункт' = substring( faddress, p4+1, p5-p4-1 ) , 'Улица' = substring( faddress, p5+1, p6-p5-1 ) , 'Дом' = substring( faddress, p6+1, p7-p6-1 ) , 'Корпус' = substring( faddress, p7+1, p8-p7-1 ) ) NewTable |
23 янв 13, 17:50 [13817244] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |