numeric
सटीक है!
दूसरे उत्तर के दावे के विपरीत, numeric
फ़्लोटिंग-पॉइंट प्रकार नहीं है , लेकिन एक मनमाने ढंग से सटीक प्रकार जैसा कि SQL मानक द्वारा परिभाषित किया गया है। संग्रहण सटीक है . मैं मैनुअल उद्धृत करता हूं:
प्रकार संख्यात्मक संख्याओं को बहुत बड़ी संख्या में अंकों के साथ संग्रहीत कर सकता है और सटीक रूप से गणना कर सकता है। यह विशेष रूप से मौद्रिक मात्रा और अन्य मात्राओं को संग्रहीत करने की अनुशंसा की जाती है जहां सटीकता की आवश्यकता होती है।
जवाब
आपके प्रश्न के लिए स्वाभाविक उम्मीदवार फ़ंक्शन है trunc()
. यह शून्य की ओर को छोटा करता है - मूल रूप से बाकी को छोड़कर पूर्णांक भाग को रखते हुए। एक त्वरित परीक्षण में सबसे तेज़, लेकिन शीर्ष दावेदारों में अंतर नगण्य है।
SELECT * FROM t WHERE amount <> trunc(amount);
floor()
अगले निचले पूर्णांक में छोटा हो जाता है, जिससे ऋणात्मक संख्याओं में अंतर आता है:
SELECT * FROM t WHERE amount <> floor(amount);
अगर आपके नंबर integer
में फिट होते हैं / bigint
आप बस कास्ट भी कर सकते हैं:
SELECT * FROM t WHERE amount <> amount::bigint;
यह दौर ऊपर के विपरीत, पूर्ण संख्याओं तक।
परीक्षा
PostgreSQL 9.1.7 के साथ परीक्षण किया गया। 10k numeric
. के साथ अस्थायी तालिका दो भिन्नात्मक अंकों वाली संख्याएं, लगभग 1% में .00
है ।
CREATE TEMP TABLE t(amount) AS
SELECT round((random() * generate_series (1,10000))::numeric, 2);
मेरे मामले में सही परिणाम:9890 पंक्तियाँ। EXPLAIN ANALYZE
. के साथ 10 रन का सर्वश्रेष्ठ समय ।
इरविन 1
SELECT count(*) FROM t WHERE amount <> trunc(amount) -- 43.129 ms
एमवीपी 2 / क्यूक्यूएक्स
SELECT count(*) FROM t WHERE amount != round(amount) -- 43.406 ms
इरविन 3
SELECT count(*) FROM t WHERE amount <> amount::int -- 43.668 ms
एमवीपी 1
SELECT count(*) FROM t WHERE round(amount,2) != round(amount) -- 44.144 ms
इरविन 4
SELECT count(*) FROM t WHERE amount <> amount::bigint -- 44.149 ms
इरविन 2
SELECT count(*) FROM t WHERE amount <> floor(amount) -- 44.918 ms
नंदकुमार वी
SELECT count(*) FROM t WHERE amount - floor(amount) > .00 -- 46.640 ms
पोस्टग्रेज 12 . में अधिकतर अभी भी सत्य है (अब सब कुछ> 10x तेज को छोड़कर)। 10k के बजाय 100k पंक्तियों के साथ परीक्षण करें:
db<>फिडल यहाँ