Oracle, запрос, помощь
От: Anton Batenev Россия https://github.com/abbat
Дата: 27.01.06 06:40
Оценка:
Hello, All!

Есть таблица clients с полями

house — номер дома
building — номер строения
flat — номер квартиры

В силу особенностей программного обеспечения, работающего с этой базой, начиная с некоторого времени, адрес клиента начал сохраняться только в поле house в виде, например:

'128' --(дом 128)
'128-15' --(дом 128, квартира 15)
'128A' --(дом 128, корпус А)
'128А-15' --(дом 128, корпус А, квартира 15)

Требуется написать запрос, который бы всю эту канитель раскидывал бы на три поля (в случае, если значение поля house не является числом), и использовал бы оригинальные значения полей building и flat, если значение поля house является числом. Т.е.

для house = '128А-15' получить:

house    building    flat
'128'    'A'         '15'


но для house = '128' оставить значения полей таким же, как в самой таблице.

Что-то у меня никак не получается это сделать
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Oracle, запрос, помощь
От: Horror_Infinity Россия  
Дата: 27.01.06 06:53
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>Требуется написать запрос, который бы всю эту канитель раскидывал бы на три поля (в случае, если значение поля house не является числом), и использовал бы оригинальные значения полей building и flat, если значение поля house является числом. Т.е.


AB>для house = '128А-15' получить:


AB>
AB>house    building    flat
AB>'128'    'A'         '15'
AB>


AB>но для house = '128' оставить значения полей таким же, как в самой таблице.


Думаю, в два захода. Сначала разделить строку "128А-15" на две части по символу разделителя ("-"). Первая часть полученного будет номером дома, вторая — квартиры. Потом первую часть бъешь на две. Можно посимвольно пробежаться; пока будут цифры — складывать их куда-нибудь. Как закончатся — это номер дома. Все, что останется, будет номером строения.
... << RSDN@Home 1.2.0 alpha rev. 631>>
Re[2]: Oracle, запрос, помощь
От: Anton Batenev Россия https://github.com/abbat
Дата: 27.01.06 07:15
Оценка:
Здравствуйте, Horror_Infinity, Вы писали:

H_I>Думаю, в два захода. Сначала разделить строку "128А-15" на две части по символу разделителя ("-"). Первая часть полученного будет номером дома, вторая — квартиры. Потом первую часть бъешь на две. Можно посимвольно пробежаться; пока будут цифры — складывать их куда-нибудь. Как закончатся — это номер дома. Все, что останется, будет номером строения.


Это я прекрасно понимаю. Я не могу дойти до того, как это сделать в теле SQL запроса, чтобы не городить лишнего?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Oracle, запрос, помощь
От: sfsoft Россия  
Дата: 27.01.06 07:25
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>) Это я прекрасно понимаю. Я не могу дойти до того, как это сделать в теле SQL запроса, чтобы не городить лишнего?


А может не стоит это писать на SQL? Я так понимаю, что скорость выполнения этой операции совсем не критична по времени? Поэтому проще парсить строку на любом другом высокоуровневом языке.
Re: Oracle, запрос, помощь
От: bloom  
Дата: 27.01.06 08:11
Оценка: 5 (1)
Здравствуйте, Anton Batenev, Вы писали:

если операция не частая
то можно поробовать вот так

DECLARE
   l_str    VARCHAR2(100) := '128A-15';
   l_tokens owa_text.vc_arr;
BEGIN
   IF owa_pattern.match(l_str, '(\d+)([A-Z]?)([\-]?)(\d*)', l_tokens)
   THEN
      dbms_output.put_line(l_tokens(1)); 
      dbms_output.put_line(l_tokens(2)); 
      dbms_output.put_line(l_tokens(3)); 
      dbms_output.put_line(l_tokens(4)); 
   END IF;
END;
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
Re: Oracle, запрос, помощь
От: OnThink Россия http://vassilsanych.livejournal.com
Дата: 27.01.06 08:24
Оценка: :)
AB>В силу особенностей программного обеспечения, работающего с этой базой, начиная с некоторого времени, адрес клиента начал сохраняться только в поле house в виде, например:

AB>'128' --(дом 128)

AB>'128-15' --(дом 128, квартира 15)
AB>'128A' --(дом 128, корпус А)
AB>'128А-15' --(дом 128, корпус А, квартира 15)

изначально расстрелять виновника этой особенности
... << RSDN@Home 1.2.0 alpha rev. 634>>
Re[3]: Oracle, запрос, помощь
От: TMU Россия  
Дата: 27.01.06 08:29
Оценка: 10 (1)
AB>) Это я прекрасно понимаю. Я не могу дойти до того, как это сделать в теле SQL запроса, чтобы не городить лишнего?

Одним запросом? А это критично?
я бы подумал в сторону маленькой процедурки на pl/sql
Re[4]: Oracle, запрос, помощь
От: Anton Batenev Россия https://github.com/abbat
Дата: 27.01.06 08:48
Оценка:
Здравствуйте, TMU, Вы писали:

AB>>) Это я прекрасно понимаю. Я не могу дойти до того, как это сделать в теле SQL запроса, чтобы не городить лишнего?

TMU>Одним запросом? А это критично?
TMU>я бы подумал в сторону маленькой процедурки на pl/sql

Все! Начал откровенно тупить к концу рабочей недели — почему-то клинануло на том, что собственные функции в теле SQL использовать нельзя, хотя запросом выше не сомневаясь их использую . Конечно же, вы правы, три маленькие процедурки решили проблему. Спасибо!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Oracle, запрос, помощь
От: Anton Batenev Россия https://github.com/abbat
Дата: 27.01.06 08:48
Оценка:
Здравствуйте, sfsoft, Вы писали:

AB>>) Это я прекрасно понимаю. Я не могу дойти до того, как это сделать в теле SQL запроса, чтобы не городить лишнего?

S>А может не стоит это писать на SQL? Я так понимаю, что скорость выполнения этой операции совсем не критична по времени? Поэтому проще парсить строку на любом другом высокоуровневом языке.

Задача так поставлена — на входе процедуры параметры, на выходе результат, который тупо пихается в файл, пакуется и отправляется.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.