आप गैर-संख्यात्मक मानों को इस तरह के उत्तर प्रदान करने वाले फ़ंक्शन के साथ फ़िल्टर कर सकते हैं। , या रेगुलर एक्सप्रेशन के साथ - जिसमें कुछ बदलाव की आवश्यकता हो सकती है:
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;