Oracle
 sql >> Base de données >  >> RDS >> Oracle

Numéros invalides

Vous pouvez filtrer les valeurs non numériques avec une fonction comme cette réponse fournit , ou avec une expression régulière - qui pourrait nécessiter quelques ajustements :

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 .

Cela exclura la plupart des non-numéros (peut-être tous, mais je ne suis pas si sûr - regex n'est pas un domaine fort), bien que la fonction de Justin soit probablement plus sûre.

Cependant, il n'y a toujours aucune garantie que la fonction de filtre sera appliquée avant le casting. Si cela se produit toujours, vous pouvez utiliser une sous-requête pour filtrer les valeurs non numériques, puis vérifier la valeur réelle de celles qui restent ; mais vous devrez probablement ajouter un indice pour empêcher Oracle de désimbriquer la sous-requête et de modifier l'ordre d'évaluation sur vous.

Une autre approche est une variante de la fonction de Justin qui renvoie le nombre réel :

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;
/

Ensuite, votre requête peut utiliser cela :

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

SQL Fiddle .