Du kan filtrere de ikke-numeriske værdier fra med en funktion som dette svar giver , eller med et regulært udtryk - som måske skal justeres:
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;
Det vil udelukke de fleste ikke-numre (måske alle, men jeg er ikke så sikker - regex er ikke et stærkt område), selvom Justins funktion sandsynligvis er mere sikker.
Der er dog stadig ingen garanti for, at filterfunktionen vil blive anvendt før støbningen. Hvis dette stadig slår ud, kan du bruge en underforespørgsel til at filtrere ikke-numeriske værdier fra og derefter kontrollere den faktiske værdi af dem, der er tilbage; men du skal sandsynligvis tilføje et tip for at forhindre Oracle i at fjerne underforespørgslen og ændre evalueringsrækkefølgen på dig.
En anden tilgang er en variation af Justins funktion, der returnerer det faktiske tal:
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;
/
Så kan din forespørgsel bruge det:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;