Możesz odfiltrować wartości nieliczbowe za pomocą funkcji takiej jak ta odpowiedź lub za pomocą wyrażenia regularnego — co może wymagać pewnych poprawek:
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;
To wykluczy większość liczb niebędących liczbami (może wszystkie, ale nie jestem tak pewny siebie - wyrażenie regularne nie jest silnym obszarem), chociaż funkcja Justina jest prawdopodobnie bezpieczniejsza.
Jednak nadal nie ma gwarancji, że funkcja filtrowania zostanie zastosowana przed rzutowaniem. Jeśli to nadal się pojawia, możesz użyć podzapytania, aby odfiltrować wartości nienumeryczne, a następnie sprawdzić rzeczywistą wartość tych, które pozostały; ale prawdopodobnie będziesz musiał dodać wskazówkę, aby powstrzymać Oracle przed rozgnieżdżaniem podzapytania i zmianą kolejności oceny.
Innym podejściem jest odmiana funkcji Justina, która zwraca rzeczywistą liczbę:
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;
/
Wtedy Twoje zapytanie może użyć tego:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;