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

वर्चर स्ट्रिंग को संख्यात्मक के रूप में ऑर्डर करें

यह बिल्कुल संभव है।

ORDER BY varchar_column::int

सुनिश्चित करें कि आपके varchar . में मान्य पूर्णांक अक्षर हैं प्रत्येक प्रविष्टि के लिए कॉलम या आपको एक अपवाद मिलता है invalid input syntax for integer: ... . (सफेद स्थान को आगे और पीछे करना ठीक है - इसे अपने आप काट दिया जाएगा।)

हालांकि, अगर ऐसा है, तो क्यों न कॉलम को integer में बदल दिया जाए? शुरुआत के लिए? छोटा, तेज, साफ-सुथरा, आसान।

अपवादों से कैसे बचें?

कलाकारों से पहले गैर-अंकीय वर्णों को हटाने के लिए और संभावित अपवादों से बचने के लिए:

ORDER BY NULLIF(regexp_replace(varchar_column, '\D', '', 'g'), '')::int
  • regexp_replace() अभिव्यक्ति प्रभावी रूप से सभी गैर-अंकों को हटा देती है, इसलिए केवल अंक ही रहते हैं या एक खाली स्ट्रिंग होती है। (नीचे देखें।)

  • \D वर्ण वर्ग के लिए आशुलिपि है [^[:digit:]] , जिसका अर्थ है सभी गैर-अंक ([^0-9] ).
    पुराने पोस्टग्रेज संस्करणों में पुरानी सेटिंग के साथ standard_conforming_strings = off , आपको पॉज़िक्स एस्केप स्ट्रिंग सिंटैक्स का उपयोग करना होगा E'\\D' बैकस्लैश से बचने के लिए \ . Postgres 8.3 में यह डिफ़ॉल्ट था, इसलिए आपको अपने पुराने संस्करण के लिए इसकी आवश्यकता होगी।

  • चौथा पैरामीटर g "विश्व स्तर पर" . के लिए है , सभी . को बदलने का निर्देश घटनाएं, केवल पहली नहीं।

  • आप हो सकता है एक अग्रणी डैश की अनुमति देना चाहते हैं (- ) ऋणात्मक संख्याओं के लिए।

  • यदि स्ट्रिंग में कोई अंक नहीं है, तो परिणाम एक खाली स्ट्रिंग है जो integer के लिए कास्ट के लिए मान्य नहीं है . खाली स्ट्रिंग्स को NULL में बदलें NULLIF . के साथ . (आप 0 पर विचार कर सकते हैं इसके बजाय।)

परिणाम वैध होने की गारंटी है। यह प्रक्रिया integer . पर कास्ट करने के लिए है जैसा कि प्रश्न के मुख्य भाग में अनुरोध किया गया है, numeric के लिए नहीं जैसा कि शीर्षक में बताया गया है।

इसे तेज़ कैसे करें?

व्यंजक पर अनुक्रमणिका एक तरीका है।

CREATE INDEX tbl_varchar_col2int_idx ON tbl
(cast(NULLIF(regexp_replace(varchar_column, '\D', '', 'g'), '') AS integer));

फिर ORDER BY . में उसी एक्सप्रेशन का इस्तेमाल करें खंड:

ORDER BY
cast(NULLIF(regexp_replace(varchar_column, '\D', '', 'g'), '') AS integer)

EXPLAIN ANALYZE . के साथ परीक्षण करें क्या कार्यात्मक सूचकांक वास्तव में उपयोग किया जाता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में छवियाँ संग्रहीत करना

  2. मिश्रित शब्द-और-संख्या स्ट्रिंग्स की मानवकृत या प्राकृतिक संख्या छँटाई

  3. postgresql:md5 संदेश डाइजेस्ट के लिए डेटा प्रकार?

  4. ActiveRecord ::StatementInvalid:PG InFailedSqlTransaction

  5. पोस्टग्रेस्क्ल इंसर्ट फ्रॉम सेलेक्ट रिटर्निंग आईडी