यहां एक टिप दी गई है:जब भी आपको सॉर्ट करने में समस्या आ रही हो, तो अपने चुनिंदा क्लॉज में आइटम्स के अनुसार ऑर्डर जोड़ें। यह आपको यह देखने में सक्षम करेगा कि आप जो क्रमबद्ध कर रहे हैं वह वास्तव में वह है जिसे आप क्रमबद्ध करना चाहते हैं:
SELECT Section,
CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
ELSE
Section
END As alphabetical_sort, -- alphabetical sort
CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
ELSE
NULL
END As Numeric_Sort
FROM dbo.Section
ORDER BY alphabetical_sort, Numeric_Sort
मेरे द्वारा सॉर्ट सही ढंग से प्राप्त करने के बाद, मुझे केवल केस स्टेटमेंट्स को क्लॉज द्वारा क्रम में ले जाना है:
SELECT Section
FROM dbo.Section
ORDER BY
CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
ELSE
Section
END , -- Alphabetical sort
CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
ELSE
NULL
END -- Numeric sort
मूल रूप से, आपको 4 प्रमुख समस्याएं थीं:
- आपके वर्णमाला क्रम के व्यंजक ने माना कि प्रत्येक पंक्ति में संख्याएँ हैं।
- आपकी वर्णानुक्रमिक क्रमबद्ध अभिव्यक्ति में संख्याओं के साथ-साथ पाठ भी शामिल है।
- आपकी संख्यात्मक क्रमबद्ध अभिव्यक्ति में संख्यात्मक और वर्णानुक्रम दोनों मान थे।
- अनुच्छेद 3 के कारण, आप अपनी संख्यात्मक सॉर्ट अभिव्यक्ति को एक संख्यात्मक प्रकार में नहीं डाल सके, और यही कारण है कि आपको एक स्ट्रिंग सॉर्ट मिलेगा।