Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Números inválidos


Você pode filtrar os valores não numéricos com uma função como esta resposta fornece , ou com uma expressão regular - que pode precisar de alguns ajustes:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and regexp_like(result_num, '^[-]?[0-9]*[\.]?[0-9]*$')
and cast(result_num as integer) > 104
group by result_num;

SQL Fiddle .

Isso excluirá a maioria dos não-números (talvez todos, mas não estou tão confiante - regex não é uma área forte), embora a função de Justin seja provavelmente mais segura.

No entanto, ainda não há garantia de que a função de filtro será aplicada antes da conversão. Se isso ainda ocorrer, você poderá usar uma subconsulta para filtrar valores não numéricos e verificar o valor real daqueles que permanecem; mas você provavelmente precisaria adicionar uma dica para impedir que o Oracle desaninhasse a subconsulta e alterasse a ordem de avaliação em você.

Outra abordagem é uma variação da função de Justin que retorna o número real:
CREATE OR REPLACE FUNCTION safe_number( p_str IN VARCHAR2 )
  RETURN NUMBER DETERMINISTIC PARALLEL_ENABLE
IS
  l_num NUMBER;
BEGIN
  l_num := to_number( p_str );
  RETURN l_num;
EXCEPTION
  WHEN value_error THEN
    RETURN null;
END safe_number;
/

Então sua consulta pode usar isso:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;

SQL Fiddle .