Nečíselné hodnoty můžete odfiltrovat pomocí funkce, kterou poskytuje tato odpověď , nebo s regulárním výrazem – což může vyžadovat nějaké úpravy:
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 vyloučí většinu nečíslic (možná všechny, ale nejsem si tak jistý – regulární výraz není silná oblast), i když Justinova funkce je pravděpodobně bezpečnější.
Stále však není zaručeno, že funkce filtru bude aplikována před obsazením. Pokud k tomu stále dochází, můžete použít poddotaz k odfiltrování nečíselných hodnot a poté zkontrolovat skutečnou hodnotu těch, které zbývají; ale pravděpodobně budete muset přidat nápovědu, abyste zabránili Oracle zrušit vnoření poddotazu a změnit pořadí hodnocení na vás.
Dalším přístupem je variace Justinovy funkce, která vrací skutečné číslo:
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;
/
Pak váš dotaz může použít toto:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;