sql >> Base de Datos >  >> RDS >> Oracle

Números inválidos

Puede filtrar los valores no numéricos con una función como la que proporciona esta respuesta , o con una expresión regular, que podría necesitar algunos 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 .

Eso excluirá a la mayoría de los que no son números (quizás a todos, pero no estoy tan seguro, la expresión regular no es un área fuerte), aunque la función de Justin probablemente sea más segura.

Sin embargo, todavía no hay garantía de que la función de filtro se aplique antes del lanzamiento. Si esto sigue fallando, podría usar una subconsulta para filtrar los valores no numéricos y luego verificar el valor real de los que quedan; pero probablemente necesite agregar una sugerencia para evitar que Oracle anule la subconsulta y cambie el orden de evaluación.

Otro enfoque es una variación de la función de Justin que devuelve el 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;
/

Entonces su consulta puede usar eso:

select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;

SQL Fiddle .