PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL में दशमलव बिंदु के बाद गैर-शून्य रिकॉर्ड प्राप्त करें

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<>फिडल यहाँ



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Liquibase/PostgreSQL:टेबल केस को सही तरीके से कैसे संरक्षित करें?

  2. PostgreSQL के साथ धीमी क्वेरी से निपटना

  3. PostgreSQL के भीतर JSON क्षमताओं का अवलोकन

  4. PostgreSQL टेक्स्ट का मानचित्रण [] [] प्रकार और जावा प्रकार

  5. Homebrew के साथ icu4c संस्करण 63 स्थापित करें