जैसा कि आपने देखा होगा, रेगेक्स-आधारित पद्धति को सही ढंग से करना लगभग असंभव है। उदाहरण के लिए, आपका परीक्षण कहता है कि 1.234e-5
वैध संख्या नहीं है, जब यह वास्तव में है। साथ ही, आप ऋणात्मक संख्याओं से चूक गए। क्या होगा यदि कोई चीज़ किसी संख्या की तरह दिखती है, लेकिन जब आप उसे संग्रहीत करने का प्रयास करते हैं तो यह अतिप्रवाह का कारण बन सकती है?
इसके बजाय, मैं ऐसा फ़ंक्शन बनाने की अनुशंसा करता हूं जो वास्तव में NUMERIC
. पर डालने का प्रयास करता है (या FLOAT
यदि आपके कार्य को इसकी आवश्यकता है) और TRUE
returns लौटाता है या FALSE
इस पर निर्भर करता है कि यह कलाकार सफल हुआ या नहीं।
यह कोड पूरी तरह से फ़ंक्शन का अनुकरण करेगा ISNUMERIC()
:
CREATE OR REPLACE FUNCTION isnumeric(text) RETURNS BOOLEAN AS $$
DECLARE x NUMERIC;
BEGIN
x = $1::NUMERIC;
RETURN TRUE;
EXCEPTION WHEN others THEN
RETURN FALSE;
END;
$$
STRICT
LANGUAGE plpgsql IMMUTABLE;
इस फ़ंक्शन को आपके डेटा पर कॉल करने पर निम्न परिणाम मिलते हैं:
WITH test(x) AS ( VALUES (''), ('.'), ('.0'), ('0.'), ('0'), ('1'), ('123'),
('123.456'), ('abc'), ('1..2'), ('1.2.3.4'), ('1x234'), ('1.234e-5'))
SELECT x, isnumeric(x) FROM test;
x | isnumeric
----------+-----------
| f
. | f
.0 | t
0. | t
0 | t
1 | t
123 | t
123.456 | t
abc | f
1..2 | f
1.2.3.4 | f
1x234 | f
1.234e-5 | t
(13 rows)
यह न केवल अधिक सही और पढ़ने में आसान है, बल्कि यदि डेटा वास्तव में एक संख्या है तो यह तेजी से काम भी करेगा।