यह बिल्कुल संभव है।
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
. के साथ परीक्षण करें क्या कार्यात्मक सूचकांक वास्तव में उपयोग किया जाता है।