Если вы можете гарантировать , что ALL (и я имею в виду ALL ) строк будут иметь фрагмент, подобный описанному вами: NUM ..... in ..... pieces
где .....
- это два числа со вторым числом, отличным от 0 (поэтому мы не делим на 0), тогда вы можете использовать для этого XMLQuery, например:
with
test_data as (
select 1 id, 'blah bahwl NUM 40003.26 in 4 pieces. etc' str from dual union all
select 2 , 'bwh balshbh NUM 6006.16 in 9 pieces. etc' from dual union all
select 3 , 'badh sh alshbh NUM 200 in 30 pieces. etc' from dual union all
select 4 , 'bfda bdafl hxksw NUM 33 in 4 pieces. etc' from dual union all
select 5 , 'bl lshbh NUM 54545.01 in 700 pieces. etc' from dual
)
select id,
xmlquery(regexp_replace(str, '^.*?NUM(.*?)in(.*?)pieces.*$', '\1 div \2')
returning content).getNumberVal() as division_result
from test_data
;
ID DIVISION_RESULT
----- ---------------
1 10000.815000
2 667.351111
3 6.666667
4 8.250000
5 77.921443
Даже если вы не знакомы с XMLQueryНетрудно понять, как это работает в этом особом случае.Вы можете выбрать SELECT результат REGEXP_REPLACE отдельно, чтобы увидеть фактический ввод в XMLQuery.
Однако это решение будет подавлять любой дополнительных входов в большем наборе данных, показанном ниже какa WITH
предложение.
Если такие исключения возможны, вы должны сообщить нам, как следует обрабатывать каждое из них.Обратите внимание, что id = 6
не имеет требуемого фрагмента вообще;id = 7
отсутствует второй номер;id = 8
имеет второе число, равное 0;и id = 9
содержит текст там, где должно быть число.
Это показывает, почему, возможно, если вам приходится сталкиваться с такими проблемами, вам следует рассмотреть возможность добавления двух столбцов, возможно, виртуальных, если ваша версия Oracle высокадостаточно, чтобы хранить только необходимые числа - тогда обработка возможных исключений станет намного проще.Это также, очевидно, приблизит вашу модель данных к первой нормальной форме, которую ваша текущая модель грубо нарушает.
with
test_data as (
select 1 id, 'blah bahwl NUM 40003.26 in 4 pieces. etc' str from dual union all
select 2 , 'bwh balshbh NUM 6006.16 in 9 pieces. etc' from dual union all
select 3 , 'badh sh alshbh NUM 200 in 30 pieces. etc' from dual union all
select 4 , 'bfda bdafl hxksw NUM 33 in 4 pieces. etc' from dual union all
select 5 , 'bl lshbh NUM 54545.01 in 700 pieces. etc' from dual union all
select 6 , 'blah blah blah' from dual union all
select 7 , 'blah blah NUM 23 in pieces etc.' from dual union all
select 8 , 'blah NUM 23 in 0 pieces' from dual union all
select 9 , 'blah NUM 12 in three pieces etc.' from dual
)
............ How should the exceptions for id between 6 and 9 be handled?