Как задать маску формата в функции to_number() для знака минуса в начале или конце строки?

Есть символьная колонка, в которой могут быть представлены отрицательные значения в двух различных форматах: знак минуса в конце и, как обычно, в начале.

До сих пор пробовал следующее, но для каждого значения, один из них выводит ошибку формата, а другой работает, и наоборот:

SELECT
    str,
    to_number(str, 'fm999.99mi') AS opt1,
    to_number(str, 'fm999.99') AS opt2
FROM (
    SELECT '-92.93' AS str FROM dual
    UNION ALL
    SELECT '92.93-' AS str1 FROM dual)

ORA-01722: invalid number

Ожидаемый вывод:

str opt1 opt2
-92.93 -92.93 -92.93
92.93- -92.93 -92.93

Можно ли обединить их, чтобы работало для обоих числовых форматов?


PS: версия 12.1.0.2.0

Свободный перевод вопроса Oracle SQL format mask to_number от участника @jeiv


Ответы (1 шт):

Автор решения: 0xdb

Маска формата это символьное значение, которое может быть составлено по условию:

select str,
    to_number(str, 'fm999.99'||case substr (str, -1) when '-' then 'mi' end) res
from (
    select '-92.93' str from dual
    union all
    select '92.93-' str1 from dual)
/

Результат:

STR           RES
------ ----------
-92.93 -92,93    
92.93- -92,93    
→ Ссылка