मेरे पास एक अनुभाग कॉलम है जो एक varchar है और मैं इसे इस तरह से सॉर्ट करने का प्रयास कर रहा हूं कि मुझे नीचे दिखाए अनुसार परिणाम मिले,

Section  
-------
1  
100  
11  
180a  
18a  
18b  
19B  
2  
A1  
A10  
A11  
A18  
A180  
A189  
A19  
A1B  
AB1  
AB10  
AB100  
Aquaman  
B1  
B2  
B20  
B21  
B3  
B32  
S  
Superman  

मैं परिणाम नीचे के रूप में होने की उम्मीद कर रहा हूँ। पहले मुझे आरोही में क्रमबद्ध संख्याएँ मिलती हैं, फिर अल्फा संख्यात्मक मान और फिर अंत में चार मान।

यह कोई मुद्दा नहीं होगा यदि यह पहले चार मान हैं तो अल्फा संख्यात्मक फिर संख्या।

Section
-------
1  
2  
11  
100  
18a  
18b  
19B  
180a  
A1  
A10  
A11  
A18  
A19  
A180  
A189  
A1B  
AB1  
AB10  
AB100  
B1  
B2  
B20  
B21  
B3  
B32  
Aquaman  
S  
Superman  

मैंने नीचे दी गई क्वेरी की कोशिश की, जिसके साथ मैं एक हद तक करीब पहुंच गया, लेकिन ठीक वैसा नहीं जैसा मैं उम्मीद कर रहा हूं।

SELECT Section
FROM dbo.Section_suw
ORDER BY
case  when ISNUMERIC(Section)=0 then Section else '0' end,
case when ISNUMERIC(Section)=1 then CONVERT(INT, Section) else -1 end

परीक्षण के उद्देश्य के लिए डेमो टेबल,

CREATE TABLE dbo.Section_suw
(
       Section varchar(50) NULL
)

INSERT INTO dbo.Section_suw (Section.Section) VALUES ('1')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('AB1')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A1')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B2')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A11')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B20')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B21')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('AB10')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B3')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('AB100')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('2')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B1')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('B32')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('11')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A10')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A1B')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A180')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A189')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('180a')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('18a')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('18b')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A18')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('A19')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('19B')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('100')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('Superman')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('Aquaman')
INSERT INTO dbo.Section_suw (Section.Section) VALUES ('S')

अग्रिम में धन्यवाद

1
Suwaid Akbar 17 अक्टूबर 2019, 15:41
1
आम तौर पर एक कॉलम को बनाए रखना एक बुरा विचार है जिसे टेक्स्ट और नंबर दोनों के रूप में व्यवहार करने की आवश्यकता होती है। इसके बजाय, मेरा सुझाव है कि टेक्स्ट और संख्यात्मक भागों को अलग-अलग कॉलम में रखें। यह कोक और पेप्सी की तरह है; आपके हाथ में एक ही समय में दोनों डिब्बे कभी नहीं होंगे।
 – 
Tim Biegeleisen
17 अक्टूबर 2019, 15:44
S, Superman के बाद क्यों दिखाई देता है?
 – 
GMB
17 अक्टूबर 2019, 15:45
1
आप @TimBiegeleisen हैं, मैंने भी ऐसा ही सोचा था जब मैंने इस कॉलम को देखा, यह पता कॉलम का एक भाग है और ऐसा लगता है कि इस कॉलम में संख्या और चार दोनों होना चाहिए, कभी-कभी केवल संख्या और कभी-कभी केवल मेरे मामले में चार इस कॉलम के साथ अटक गया क्योंकि मैं एक डीबी पर काम कर रहा हूं जो अच्छी तरह से बनाया गया है। :(
 – 
Suwaid Akbar
17 अक्टूबर 2019, 15:46
उफ़ @GMB....मैंने इसे अभी देखा....मेरे पास संपादित करने का विकल्प नहीं है....या मुझे देखने दें कि क्या मैं प्रश्न को संपादित कर सकता हूँ।
 – 
Suwaid Akbar
17 अक्टूबर 2019, 15:49
जिस तरह से मैं इसे व्यावहारिक रूप से काम करते हुए देख सकता था, वह आपके संख्यात्मक और गैर-संख्यात्मक भागों को विभाजित करना है, और फिर उन पर छाँटना है। यदि आपके पास एक एकल संख्यात्मक भाग है जो बहुत गन्दा नहीं है, हालांकि, यदि आपके पास '1B9A' जैसा है तो यह गड़बड़ हो जाएगा।
 – 
Larnu
17 अक्टूबर 2019, 15:57

2 जवाब

यह तब तक काम करता है जब तक आप SQL सर्वर के उस संस्करण पर हैं जो TRY_CAST (2012 के बाद) का समर्थन करता है।

SELECT Section
FROM dbo.Section_suw
ORDER BY ISNULL(TRY_CAST(Section as int),2147483647),Section

DBFiddle.uk

0
BarneyL 17 अक्टूबर 2019, 15:52
1
हालांकि, क्या यह 'A180' पहले 'A19' और 'A2' जैसे मानों को क्रमबद्ध नहीं करेगा?
 – 
Larnu
17 अक्टूबर 2019, 15:54
आपका समाधान 180a पहले 18a क्रमित करता है।
 – 
Tim Biegeleisen
17 अक्टूबर 2019, 15:55
ठीक है तो मैंने यह कोशिश की SELECT Section FROM dbo.Section_suw ORDER BY case when ISNUMERIC(Section)=0 then iif(PATINDEX('%[0-9]%',Section)>0,Section,'z'+Section) else '0' end, case when ISNUMERIC(Section)=1 then CONVERT(INT, Section) else -1 end परिणाम = मुझे 18a से पहले 180a को छोड़कर सभी अपेक्षित रूप से मिलते हैं
 – 
Suwaid Akbar
17 अक्टूबर 2019, 16:18

ये कोशिश करें,

SELECT Section FROM dbo.Section_suw
ORDER BY
case when ISNUMERIC(Section)=0  then  iif(PATINDEX('%[0-9]%',Section)>0,Section,'z'+Section) else '0' end
0
Thangadurai.B 17 अक्टूबर 2019, 16:12
ठीक है तो मैंने यह कोशिश की SELECT Section FROM dbo.Section_suw ORDER BY case when ISNUMERIC(Section)=0 then iif(PATINDEX('%[0-9]%',Section)>0,Section,'z'+Section) else '0' end, case when ISNUMERIC(Section)=1 then CONVERT(INT, Section) else -1 end नतीजतन, मुझे 18a से पहले 180a को छोड़कर, उम्मीद के मुताबिक सब कुछ मिलता है
 – 
Suwaid Akbar
17 अक्टूबर 2019, 17:14