Можете да филтрирате нечисловите стойности с функция като този отговор предоставя , или с регулярен израз - който може да се нуждае от известна промяна:
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;
Това ще изключи повечето не-числа (може би всички, но не съм толкова уверен - регулярният израз не е силна област), въпреки че функцията на Джъстин вероятно е по-безопасна.
Въпреки това все още няма гаранция, че функцията за филтриране ще бъде приложена преди актьорския състав. Ако това все още възникне, можете да използвате подзаявка, за да филтрирате нечислови стойности и след това да проверите действителната стойност на тези, които остават; но вероятно ще трябва да добавите подсказка, за да спрете Oracle да деактивира подзаявката и да промени реда на оценка за вас.
Друг подход е вариант на функцията на Джъстин, която връща действителното число:
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;
/
Тогава вашата заявка може да използва това:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;