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' оставить значения полей таким же, как в самой таблице.
Здравствуйте, 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" на две части по символу разделителя ("-"). Первая часть полученного будет номером дома, вторая — квартиры. Потом первую часть бъешь на две. Можно посимвольно пробежаться; пока будут цифры — складывать их куда-нибудь. Как закончатся — это номер дома. Все, что останется, будет номером строения.
Здравствуйте, Horror_Infinity, Вы писали:
H_I>Думаю, в два захода. Сначала разделить строку "128А-15" на две части по символу разделителя ("-"). Первая часть полученного будет номером дома, вторая — квартиры. Потом первую часть бъешь на две. Можно посимвольно пробежаться; пока будут цифры — складывать их куда-нибудь. Как закончатся — это номер дома. Все, что останется, будет номером строения.
Это я прекрасно понимаю. Я не могу дойти до того, как это сделать в теле SQL запроса, чтобы не городить лишнего?
Здравствуйте, Anton Batenev, Вы писали:
AB>) Это я прекрасно понимаю. Я не могу дойти до того, как это сделать в теле SQL запроса, чтобы не городить лишнего?
А может не стоит это писать на SQL? Я так понимаю, что скорость выполнения этой операции совсем не критична по времени? Поэтому проще парсить строку на любом другом высокоуровневом языке.
если операция не частая
то можно поробовать вот так
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;
AB>В силу особенностей программного обеспечения, работающего с этой базой, начиная с некоторого времени, адрес клиента начал сохраняться только в поле house в виде, например:
AB>'128' --(дом 128) AB>'128-15' --(дом 128, квартира 15) AB>'128A' --(дом 128, корпус А) AB>'128А-15' --(дом 128, корпус А, квартира 15)
Здравствуйте, TMU, Вы писали:
AB>>) Это я прекрасно понимаю. Я не могу дойти до того, как это сделать в теле SQL запроса, чтобы не городить лишнего? TMU>Одним запросом? А это критично? TMU>я бы подумал в сторону маленькой процедурки на pl/sql
Все! Начал откровенно тупить к концу рабочей недели — почему-то клинануло на том, что собственные функции в теле SQL использовать нельзя, хотя запросом выше не сомневаясь их использую . Конечно же, вы правы, три маленькие процедурки решили проблему. Спасибо!
Здравствуйте, sfsoft, Вы писали:
AB>>) Это я прекрасно понимаю. Я не могу дойти до того, как это сделать в теле SQL запроса, чтобы не городить лишнего? S>А может не стоит это писать на SQL? Я так понимаю, что скорость выполнения этой операции совсем не критична по времени? Поэтому проще парсить строку на любом другом высокоуровневом языке.
Задача так поставлена — на входе процедуры параметры, на выходе результат, который тупо пихается в файл, пакуется и отправляется.