क्रम संख्या के लिए एसक्यूएल - 1,10,11,12 के बजाय 1,2,3,4 आदि


86

मैं अपने डेटाबेस में एक नंबर कॉलम द्वारा ऑर्डर करने का प्रयास कर रहा हूं जिसमें 1-999 मूल्य हैं

जब मैं उपयोग करता हूं

ORDER_BY registration_no ASC

मुझे मिला…।

1
101
102
103
104
105
106
107
108
109
11
110
Etc…

तो यह संख्या के विरोध के रूप में पहले अंक द्वारा आदेश देता प्रतीत होता है।

क्या किसी को पता है कि अगर मैं इसे मूल्य के अनुसार ऑर्डर करना चाहता हूं तो एसक्यूएल का उपयोग क्या है? तो 1,2,3,4,5,6आदि


11
आपका कॉलम varchar प्रकार का है जिसके कारण आप इस व्यवहार का सामना कर रहे हैं।
मेहरज़ाद

Registration_no कॉलम का डेटाटाइप क्या है?
प्रवीण प्रसन्न

9
order by registration_no + 0 ascअपनी समस्या को हल करने के लिए उपयोग करें ।
मेहरज़ाद

10
आपको किसी वर्ण स्तंभ में संख्याओं को संग्रहीत नहीं करना चाहिए । आपकी समस्या उस त्रुटि का प्रत्यक्ष परिणाम है।
a_horse_with_no_name

मेरा कॉलम वर्चर है और जो डेटा मैं स्टोर कर रहा हूं वह क्लास 10 / क्लास 9 / क्लास 8 है। अब क्लास 10 क्लास से पहले आता है। मैं इसे डिस्प्ले_ऑर्डर कॉलम के लिए बिना हल किए कैसे करूं?
विष्णु राठ ५

जवाबों:


139

पॉजिटिव पूर्णांकों द्वारा ऑर्डर करने का एक तरीका, जब वे के रूप में संग्रहीत होते हैं varchar, तो पहले लंबाई और फिर मूल्य के अनुसार ऑर्डर करना होता है:

order by len(registration_no), registration_no

यह विशेष रूप से उपयोगी है जब कॉलम में गैर-संख्यात्मक मान शामिल हो सकते हैं।

नोट: कुछ डेटाबेस में, एक स्ट्रिंग की लंबाई पाने के लिए फ़ंक्शन को length()इसके बजाय कहा जा सकता है len()


1
यह सभी मामलों में काम नहीं करेगा। सिर के ऊपर से, ऐसे मामले जो काम नहीं करेंगे, के साथ पूरी संख्याओं का मिश्रण है; ऋणात्मक संख्या, अग्रणी शून्य के साथ संख्या, भिन्न के साथ संख्या और शब्द और संख्या संयुक्त।
वंडरवर्कर

10
@ नॉकरलेस-नोगिंस। । । जवाब का पहला वाक्य पढ़ें। मुझे लगता है कि यह काफी स्पष्ट है।
गॉर्डन लिनोफ

@GordonLinoff एक ही कॉलम द्वारा दो बार आदेश दे रहा है सीपीयू और मेमोरी गहन नहीं है?
लोनस्टार

@ अछूत। । । order byप्रदर्शन पर चाबियों की संख्या का प्रभाव कम है।
गॉर्डन लिनोफ 18

1
Oracle SQL के लिए, length()len()
Stevoisiak

61
ORDER_BY cast(registration_no as unsigned) ASC

स्पष्ट रूप से मान को एक संख्या में परिवर्तित करता है। उसी को प्राप्त करने की एक और संभावना होगी

ORDER_BY registration_no + 0 ASC

जो एक अंतर्निहित बातचीत को मजबूर करेगा।

वास्तव में आपको टेबल की परिभाषा की जांच करनी चाहिए और इसे बदलना चाहिए। आप डेटा प्रकार को intइस तरह बदल सकते हैं

ALTER TABLE your_table MODIFY COLUMN registration_no int;

13

यदि आप SQL सर्वर का उपयोग कर रहे हैं:

ORDER_BY cast(registration_no as int) ASC

3
ORDER_BY cast(registration_no as unsigned) ASC

चेतावनी के साथ वांछित परिणाम देता है।

इसलिए, के लिए जाना बेहतर है

ORDER_BY registration_no + 0 ASC

बिना किसी SQL चेतावनी के एक साफ परिणाम के लिए।


2

मुझे लगता है कि आपका कॉलम प्रकार STRING (CHAR, VARCHAR, आदि) है और छंटनी प्रक्रिया इसे एक स्ट्रिंग के रूप में क्रमबद्ध कर रही है। आपको क्या करना है मूल्य को संख्यात्मक मूल्य में बदलना है। यह कैसे करें यह आपके द्वारा उपयोग किए जाने वाले SQL सिस्टम पर निर्भर करेगा।


1

कभी-कभी आपके पास पाठ के साथ मिश्रित संख्याओं को संग्रहीत करने के बारे में कोई विकल्प नहीं होता है। हमारे अनुप्रयोगों में से एक में, वेब साइट होस्ट जो हम अपने ई-कॉमर्स साइट के लिए उपयोग करते हैं, फ़िल्टर को गतिशील रूप से सूचियों से बाहर कर देता है। किसी भी क्षेत्र लेकिन प्रदर्शित पाठ के आधार पर छाँटने का कोई विकल्प नहीं है। जब हम एक सूची बनाना चाहते थे, जिसमें 2 "से 8" 9 "से 12" 13 "से 15" आदि जैसी चीजें शामिल थीं, तो हमें 2-9-13 के लिए छांटने की जरूरत थी, 13-2-9 के रूप में जब यह होगा संख्यात्मक मानों को पढ़ना। इसलिए मैंने एक अग्रणी स्थान के साथ किसी भी छोटी संख्या को पैड करने के लिए सबसे लंबे समय की संख्या के साथ SQL सर्वर प्रतिकृति फ़ंक्शन का उपयोग किया। अब 20 को 3 के बाद हल किया जाता है, और इसी तरह।

मैं एक ऐसे दृश्य के साथ काम कर रहा था जिसने मुझे आइटम प्रकार और वर्ग के लिए न्यूनतम और अधिकतम लंबाई, चौड़ाई आदि प्रदान की थी, और यहां एक उदाहरण है कि मैंने पाठ कैसे किया। (LB n निम्न और LB n उच्च 5 लंबाई वाले कोष्ठक के निम्न और उच्च अंत हैं।)

REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text,
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text

1

मैं डेटा के लिए "पैड" करना पसंद करता हूं। MySql इसे LPAD कहता है, लेकिन आप SQL सर्वर में एक ही काम करने के लिए अपना काम कर सकते हैं।

ORDER BY  REPLACE(STR(ColName, 3), SPACE(1), '0') 

यह सूत्र कॉलम 3 की लंबाई के आधार पर अग्रणी शून्य प्रदान करेगा। ORDER BY के बाहर अन्य स्थितियों में यह कार्यक्षमता बहुत उपयोगी है, इसलिए मैं यह विकल्प प्रदान करना चाहता था।

परिणाम: 1 001 हो जाता है, और 10 010 हो जाता है, जबकि 100 समान रहता है।


0

यह समस्या सिर्फ इसलिए है क्योंकि आपने CHAR, VARCHAR या TEXT डेटाटाइप में कॉलम घोषित किया है। बस डेटाटाइप को INT, BIGINT आदि में बदलें। यह आपके कस्टम ऑर्डरिंग की समस्या को हल करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.