Вы можете манипулировать как числа, а не преобразовывать (и предположительно позже обратно) строки:
with your_table (original) as (
select 4789654 from dual
union all select 2754678 from dual
union all select 1765689 from dual
union all select 999 from dual
union all select 1000 from dual
union all select 1001 from dual
)
select original,
original
- trunc(original, -floor(log(10, original)))
+ 7 * power(10, floor(log(10, original))) as wanted
from your_table;
ORIGINAL WANTED
---------- ----------
4789654 7789654
2754678 7754678
1765689 7765689
999 799
1000 7000
1001 7001
floor(log(10, original)
дает вам величину числа. Например, для вашего первого исходного значения 4789654, которое оценивается как 6. Если вы затем наберете trunc(original, -floor(log(10, original)))
, то есть trunc(4789654, -6)
, который обнуляет шесть младших значащих цифр, давая вам 4000000. Вычитая это из исходного значения, вы получите 789654. Затем power(10, floor(log(10, original)))
дает вам power(10, 6)
, что составляет 1000000, умножение на 7 дает 7000000 и добавление этого значения дает 7789654.
(Это не сработает, если исходное значение <= ноль , но это выглядит маловероятным?) </p>