Я хочу выбрать из моей процедуры только целые и десятичные числа. В этом случае 192 и 193,0. Я попробовал regexp_like (columnName, '^ [[: digit:]] * $'), но он выглядит как 192 (целые). Заранее спасибо.
Если вы используете 12.2 или выше, вы можете использовать предложение default <value> on conversion error , чтобы вернуть значение по умолчанию, когда str не может быть преобразовано в число.
default <value> on conversion error
например:
select 'abc' str, to_number('abc' default null on conversion error) str_num from dual; str str_num --- ------- abc
См. это dbfiddle для демонстрации.
Я бы порекомендовал такую функцию:
CREATE OR REPLACE FUNCTION IsNumeric(Expression IN VARCHAR2) RETURN INTEGER IS val NUMBER; BEGIN val := TO_NUMBER(Expression); RETURN 1; EXCEPTION WHEN VALUE_ERROR OR INVALID_NUMBER THEN RETURN 0; END IsNumeric;
Попробуйте
regexp_like(columnName, '^[[:digit:]]*(\.[[:digit:]]+)?$')
Это позволяет дополнительной точке, за которой следует хотя бы одна цифра, следовать первой последовательности цифр.
Как насчет TRANSLATE?
TRANSLATE
SQL> with test (col) as 2 (select 'Negativo' from dual union all 3 select '192' from dual union all 4 select '193.3' from dual union all 5 select '20.a4' from dual 6 ) 7 select col 8 from test 9 where translate(col, '0123456789.', 'a') is null; COL -------- 192 193.3 SQL>