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