C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Нужно удалить в поле лишние символы — "д.", (тем кто знает Transact-SQL)
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 впихнуть, вот
в чем вопрос smile.gif
Попробую, конечно, и на 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


тест, работает smile.gif
SQL
declare @s varchar(200)
set @s = '832,Россия,Брянская обл,Брянск г,Дзержинского ул,д.20,,'
select dbo.udf_HouseReplace(@s)
Black Fox
Отправлено: 07.08.2005, 15:45


Ученик-кочегар

Группа: Участник
Сообщений: 10



Спасибо за помощь smile.gif

Вернуться в Работа с базами данных в C++Builder