SQL Возникновение символа Заменить проблему - PullRequest
0 голосов
/ 06 мая 2020

Я работаю над Oracle s SQL и хотел бы получить следующие результаты:

4,500,400,40 --> 4 500 400,40

5400200,00   --> 5 400 200,00

1200,988,00  --> 1 200 988,00

Я пытался использовать REGEXP_REPLACE, но безрезультатно, поэтому, если кто-то мог бы мне помочь, если бы было замечательно.

Спасибо.

1 Ответ

1 голос
/ 06 мая 2020

Вот один из вариантов:

SQL> with test (col) as
  2    (select '4,500,400,40' from dual union all
  3     select '5400200,00'   from dual union all
  4     select '1200,988,00'  from dual union all
  5     select '28 200 600,5' from dual union all
  6     select '40 500 600'   from dual
  7    )
  8  select col,
  9  to_char(
 10    to_number(  replace(  replace(case when instr(col, ',') = 0 then col ||',00'
 11                                       else col
 12                                  end,
 13                                  ' ', ','
 14                                 ),
 15                          ',', ''
 16                        )
 17             ) / 100,
 18                 'fm999G999G999G990D00',
 19                 'nls_numeric_characters = '', '''
 20                ) result
 21  from test;

COL          RESULT
------------ -------------------
4,500,400,40 4 500 400,40
5400200,00   5 400 200,00
1200,988,00  1 200 988,00
28 200 600,5 2 820 060,05
40 500 600   40 500 600,00

SQL>

Что он делает (теперь, когда он стал более сложным)?

  • вложенный REPLACE:
    • внутренний проверяет, содержит ли исходная строка символ запятой ,; если нет, добавляет суффикс ,00 (это для значений вроде '40 500 600')
    • external как и раньше - заменяет запятые пустой строкой
  • to_number преобразует такая строка на число
  • делится на 100
  • to_char форматирует
...