Полагаю, лучшим подходом было бы хранить числа как числа (потому что этот является правильным типом данных для чисел).
Когда дело доходит до представления чисел, я бы использовал to_char(<number goes here>, '999g999g999d999')
.
Редактировать : Ну, я думаю, я понял это сейчас. Числа уже в неправильном формате. Я не знаю, можете ли вы использовать case .. when
в своем процессе, но это может дать вам представление:
with data_table as (
select '123,456,789.111' as n from dual union all
select '789.111' as n from dual union all
select '-2.345' as n from dual union all
select '777.777.777,777' as n from dual
) select
case when
n like '%.%,%'
then to_number(n, '999g999g999d999', 'nls_numeric_characters='',.''')
else to_number(n, '999g999g999d999', 'nls_numeric_characters=''.,''')
end
from data_table;