Ваша основная проблема в том, что числа, которые вы найдете, могут содержать точку или запятую, и оба представляют десятичный разделитель.Вы сами отправили ответ:
SELECT
CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$')
THEN TO_NUMBER(empno) ELSE 0 END
FROM emp;
, но это не даст ни запятой, ни точкой, потому что СУБД по умолчанию не интерпретирует оба как десятичный разделитель.
ВыКонечно, можно просто выбрать строку:
SELECT
CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$')
THEN empno ELSE '0' END
FROM emp;
Если вам нужно выбрать строку, преобразованную в число, сделайте строку последовательной (т.е. замените точку запятой или наоборот) и отобразите соответствующий форматпри использовании TO_CHAR
:
SELECT
CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$')
THEN TO_NUMBER(REPLACE(empno, ',', '.'), '90.9999999') ELSE 0 END
FROM emp;
Соответственно, начиная с Oracle 12c Release 2 вы можете использовать:
SELECT TO_NUMBER(REPLACE(empno, ',', '.') DEFAULT 0 ON CONVERSION ERROR, '90.9999999')
FROM emp;
(Этот последний запрос, однако, мог бы принять '12,'
и '12.'
как действительные числа (а именно как число 12), что запрещено регулярным выражением.)