सबसे आसान उपाय है शून्य को पहले से पेंड करना
Select ...
From Table
Order By Right( '0000000000' + YourColumn, 10)
हालांकि, यह अल्फा वर्णों के लिए जिम्मेदार नहीं होगा। अल्फा वर्णों से निपटने के लिए, आपको यह जानना होगा कि आपके पास कितने संभावित अल्फा वर्ण हो सकते हैं। अगर कोई है, तो आप कुछ ऐसा कर सकते हैं:
Select ...
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
जोड़
टेस्ट रन:
If object_id('tempdb..#Test') is not null
Drop Table #Test
Create Table #Test ( NumVal varchar(10) )
Insert #Test(NumVal) Values('02')
Insert #Test(NumVal) Values('03')
Insert #Test(NumVal) Values('1a')
Insert #Test(NumVal) Values('1b')
Insert #Test(NumVal) Values('10')
Insert #Test(NumVal) Values('11')
Select NumVal
From #Test
Order By Case
When IsNumeric(NumVal) = 1 Then Right('0000000000' + NumVal + '0', 10)
Else Right('0000000000' + NumVal, 10)
End
Results:
1a
1b
02
03
10
11
मेरे समाधान के बारे में एक नोट। यदि यह मामला है कि वर्णमाला वर्णों का विशेष अर्थ है, तो जैसा कि एरिक रॉबर्टसन ने सुझाव दिया था, आपको डेटा को अलग-अलग कॉलम में तोड़ देना चाहिए। उपरोक्त समाधान केवल दो बहुत ही विशिष्ट मामलों को संभालेगा:एक सभी संख्यात्मक मान, एक एकल अनुगामी वर्ण के साथ एक मान। यदि डेटा में कई अक्षर वर्ण हो सकते हैं या वर्णानुक्रम वर्ण कभी-कभी मान के अंत के अलावा अन्य स्थान पर होता है, तो मेरा समाधान काम नहीं करेगा। इसके अलावा, यह ध्यान दिया जाना चाहिए कि मेरा समाधान प्रत्येक मान पर ऑर्डर-सक्षम स्ट्रिंग का मूल्यांकन करने के लिए टेबल स्कैन का कारण बन जाएगा।
यदि आप जो चाहते हैं वह एकमुश्त त्वरित समाधान है, तो मेरा दृष्टिकोण काम करेगा। यदि आप एक दीर्घकालिक समाधान की तलाश कर रहे हैं, तो या तो डेटा को अलग-अलग कॉलम में विभाजित करें, नासमझ सॉर्ट ऑर्डर स्वीकार करें या एक कॉलम जोड़ें जो प्रत्येक मान के लिए सापेक्ष सॉर्ट ऑर्डर को निर्देशित करता है।