Вы можете избежать регулярных выражений и использовать вместо них instr
и substr
:
select text_value,
to_number(case when instr(text_value, ':') > 0
then substr(text_value, 1, instr(text_value, ':') - 1)
else null end) as num,
to_number(case when instr(text_value, ':') > 0
then substr(text_value, instr(text_value, ':') + 1)
else null end) as fraction2
from b;
Это делает больше вызовов отдельных функций, но они могут все же работать лучше, чем регулярные выражения, и вы можете переместить instr
во встроенное представление, если хотите, так что вы не делаете это четыре раза (хотя оптимизатор может кэшировать результат в любом случае).
Демонстрация SQL Fiddle с использованием нескольких значений из вашего изображения и нескольких других вариантов, на которые вы не ссылались, и которые вы, возможно, захотите обработать по-другому.
Если они обрабатываются не так, как вы хотите, вы можете отрегулировать условия выражения регистра, например, для num
меняется на > 1
, а для fraction2
сравнивается с длиной строки - но это зависит от того, что вы хотите увидеть (и могут ли эти сценарии вообще существовать).