Black Fox |
Отправлено: 27.07.2005, 22:44 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 10
|
Сервер: MSSQL
Есть поле: N230 — содержит адрес в виде: "832,Россия,<регион>,<город>,<улица>,<дом>,<корпус>,<квартира>"
Необходимо: из <дом> убрать символы "д."
Например: "832,Россия,Брянская обл,Брянск г,Дзержинского ул,д.20,," изменить на "832,Россия,Брянская обл,Брянск г,Дзержинского ул,20,,"
по всей таблице учитывая что <улица> может содержать "д.", а это
нельзя менять.
Ограничение: Изменение должно быть написано на Transact-SQL'е.
Помогите, не используя средств Си не знаю как подобраться к решению из-за "д." в <улице>.
|
|
AVC |
Отправлено: 28.07.2005, 08:29 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE | Помогите, не используя средств Си не знаю как подобраться к решению
|
Нужно найти функцию сервера, которая делает замену. В Oracle это выглядит например так:
Update BBYT.BBYT Set TDOM = Replace(TDOM,'ЦОК') Where TDOM like Upper('%цок')
Update BBYT.BBYT Set TDOM = Replace(TDOM,'ЦО') Where TDOM like Upper('%цо')
Update BBYT.BBYT Set TDOM = Replace(TDOM,'Ц') Where TDOM like Upper('%ц')
|
|
olegenty |
Отправлено: 28.07.2005, 08:37 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
по уму бы конечно хотя бы к первой нормальной форме табицу привести, т.е. разбить это поле на набор полей, характеризующих адрес.
а вообще, решение такое — найти подстроку между 5-й и 6-й запятыми и сделать её replace на новое значение, если там содержится "д."
прощего всего реалиpовать это через UDF, вот только времени писать эту UDF совсем нет. если хочешь быстрый готовый ответ — задай вопрос на SQL.RU
|
|
Black Fox |
Отправлено: 28.07.2005, 19:21 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 10
|
AVC:
Что вы имеете ввиду под функцией сервера?
Если хранимую процедуру программного продукта,
то такой нет иначе я бы не спрашивал.
Или стандартную SQL-скую функцию, такую тоже искал,
может конечно не там где надо ;-)
olegenty:
К нормальной форме уже приведено. Для вновь вводимых
адресов. А эти адреса тянутся из фоксовской базы,
привести в нормальную форму невозможно, нет строгого
соблюдения структуры адреса (в фоксе было комментарием и
что хотели, то и вводили мои любимые юзера!). А в ручную
доводить никакого желания... ведь записей чуть меньше миллиона.
Решение-то понятно, но как его в update впихнуть, вот
в чем вопрос
Попробую, конечно, и на sql.ru задать.
|
|
AVC |
Отправлено: 29.07.2005, 07:54 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
Что вы имеете ввиду под функцией сервера?
Если хранимую процедуру программного продукта,
то такой нет иначе я бы не спрашивал.
|
Да, именно это. И это может не быть не только SP, но и функция "встроенная" в сервер. Её нет — стоит написать и оформить в виде SP (UDF), пригодится.
|
|
olegenty |
Отправлено: 31.07.2005, 11:02 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
сама функция
SQL | SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
create function dbo.udf_HouseReplace(@Address varchar(200))
returns varchar (200)
as begin -- стартовая запятая для замены (сюда запишется индекс 5-й запятой в строке)
declare @start tinyint
set @start = 0
-- счётчик запятых
declare @count tinyint
set @count = 0
-- цикл поиска индекса 5-й запятой
while (@count < 5) begin set @start = charindex(',', @Address, @start + 1)
set @count = @count + 1
end
-- если 5-я запятая не найдена, вернуть исходную строку
if @start = 0 return @Address
-- переменная для индекса 6-й запятой
declare @finish tinyint
set @finish = charindex(',', @Address, @start + 1)
-- если 6-я запятая не найдена, то принимаем за её позицию длину строки
if @finish = 0 set @finish = len(@Address)
-- переменная, куда будет записан шмоток строки между 5-й и 6-й запятыми
declare @test varchar(100)
set @test = substring(@Address, @start, @finish - @start)
-- переменная, куда будет записана тестовая строка без 'д.'
declare @res varchar(100)
-- если 'д.' всё же встречается, то генеряем подстроку без 'д.'
if charindex('д.', @test) > 0 begin set @res = replace(@test, 'д.', '')
return replace(@Address, @test, @res)
end
return @Address
end
|
тест, работает
SQL | declare @s varchar(200)
set @s = '832,Россия,Брянская обл,Брянск г,Дзержинского ул,д.20,,'
select dbo.udf_HouseReplace(@s)
|
|
|
Black Fox |
Отправлено: 07.08.2005, 15:45 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 10
|
Спасибо за помощь
|
|
|