Anda dapat memfilter nilai non-numerik dengan fungsi seperti yang disediakan jawaban ini , atau dengan ekspresi reguler - yang mungkin memerlukan beberapa penyesuaian:
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;
Itu akan mengecualikan sebagian besar non-angka (mungkin semua, tapi saya tidak terlalu percaya diri - regex bukan area yang kuat), meskipun fungsi Justin mungkin lebih aman.
Namun, masih belum ada jaminan bahwa fungsi filter akan diterapkan sebelum casting. Jika ini masih naik maka Anda dapat menggunakan subquery untuk memfilter nilai non-numerik dan kemudian memeriksa nilai aktual dari nilai yang tersisa; tetapi Anda mungkin perlu menambahkan petunjuk untuk menghentikan Oracle menghapus subkueri dan mengubah urutan evaluasi pada Anda.
Pendekatan lain adalah variasi dari fungsi Justin yang mengembalikan angka sebenarnya:
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;
/
Maka kueri Anda dapat menggunakan itu:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;