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