Puoi filtrare i valori non numerici con una funzione come questa risposta fornisce o con un'espressione regolare, che potrebbe richiedere qualche ritocco:
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;
Ciò escluderà la maggior parte dei non numeri (forse tutti, ma non sono così sicuro - regex non è un'area forte), anche se la funzione di Justin è probabilmente più sicura.
Tuttavia, non c'è ancora alcuna garanzia che la funzione di filtro venga applicata prima del cast. Se questo si verifica ancora, puoi utilizzare una sottoquery per filtrare i valori non numerici e quindi controllare il valore effettivo di quelli che rimangono; ma probabilmente dovresti aggiungere un suggerimento per impedire a Oracle di annullare l'annidamento della sottoquery e modificare l'ordine di valutazione su di te.
Un altro approccio è una variazione della funzione di Justin che restituisce il numero effettivo:
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;
/
Quindi la tua query può utilizzare quella:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;