Запрос для вывода только числовых значений, используем REGEXP.
При необходимости, оставляем только точку или запятую ‘^-?[[:digit:].]*$‘ или ‘^-?[[:digit:],]*$‘.
Или только целые числа ‘^-?[[:digit:]]*$‘
with t as ( select '56456456' str from dual union all select '4 5' str from dual union all select 'sds5' str from dual union all select '-1,5' str from dual union all select '-1.5' str from dual ) select * FROM t where regexp_like(str, '^-?[[:digit:].,]*$'); STR -------- 56456456 -1,5 -1.5
Ну и более простой вариант, который тоже подходит в некоторых случаях:
select case when length(TRIM(TRANSLATE('45', ' 0123456789', ' '))) is null then 'ЧИСЛО' else 'СТРОКА' end res from dual union all select case when length(TRIM(TRANSLATE('a4', ' 0123456789', ' '))) is null then 'ЧИСЛО' else 'СТРОКА' end res from dual
Вывести строки, которые начинаются на цифру
with t as ( select '56456456' str from dual union all select '4 5' str from dual union all select 'sds5' str from dual union all select '-1,5' str from dual union all select '-1.5' str from dual ) select * FROM t where regexp_like(str, '^\d'); STR -------- 56456456 4 5
если проверить ‘4 5’ то получим что это число, хотя это не число и to_number(‘4 5’) выдаст ошибку ORA-01722: invalid number…
@alex
Символ замены, в этом случае, должен быть не пробел, а любой другой символ, который отсутствует в наборе строк. Этот способ, конечно, не универсальный, но во многих случаях может подойти.
select case when (length(’45’)-length(TRANSLATE(‘4 5’, ‘0123456789’,’~’)))>0
then ‘СТРОКА’
else ‘ЧИСЛО’
end res from dual;