sql - कॉम्प्लेक्स सॉर्ट ऑफ़ फील्ड "स्ट्रिंग-नंबर स्ट्रिंग"



sql-server sql-server-2008 (2)

असल में, मैं इसके नाम से एक टेबल को सॉर्ट करने की कोशिश कर रहा हूं। तालिका अपेक्षाकृत बड़ी है, लेकिन उदाहरण के लिए मैं केवल एक कॉलम पोस्ट कर रहा हूं कॉलम नीचे स्टेशन है

Station
===
ANTIL WELL 1
ANTIL WELL 2
BASELINE & CALIFORNIA WELL
EPA WELL 6
EPA WELL 7
EPA WELL 108
EPA WELL 109
EPA WELL 110
EPA WELL 111
EPA WELL 112
EPA WELL 108S

ऊपर की तरह मुझे यह कोशिश कर रही थी:

order by left(station,LEN(station) -PATINDEX('%[^0-9]%',REVERSE(station))+1)
,CONVERT(int,REVERSE(LEFT(REVERSE(station), PATINDEX('%[^0-9]%',REVERSE(station)) - 1)))

हालांकि, मैं इसे ठीक नहीं कर सकता कि EPA Well 108S मुझे ईपीए वेल 108 और ईपीए वेल 109 के बीच जाने की आवश्यकता है, मैंने कई कई अलग-अलग तरीकों की कोशिश की

ईपीए के बाद भी स्टेशनों की सूची चलती है

https://src-bin.com


Answer #1

मुझे इसकी आवश्यकता EPA Well 108 और EPA Well 109 के बीच जाना है

तब आप इसे नाम से नहीं छँटा रहे हैं; आप इसे अलग subcomponents द्वारा वर्गीकृत कर रहे हैं जो भी नाम स्तंभ में शामिल किया जाना है, लेकिन एक अलग क्रम में। आपको प्रत्येक उप घटक के लिए कॉलम बनाने और सबकंपोनेंट्स द्वारा सॉर्ट करना होगा:

Name            sc1         sc2    sc3
EPA WELL 108    EPA WELL    108
EPA WELL 6      EPA WELL      6
EPA WELL 7      EPA WELL      7
EPA WELL 109    EPA WELL    109
EPA WELL 108s   EPA WELL    108      s

फिर आप इस तरह से एक आदेश द्वारा खंड का उपयोग कर सकते हैं:

ORDER BY sc1, sc2, sc3

यदि आप डेटा को दोहराए जाने से बचना चाहते हैं, तो नाम कॉलम को हटा दें और उपनामों से अपना प्रदर्शन नाम इकट्ठा करें:

SELECT sc1 + ' ' + Convert(VarChar, sc2) + sc3 AS Name

रनटाइम पर नाम को तेज करना आसान और आसान है यह न तो तेज़ और न ही आसान है, क्रमशः पर वर्कर के चर-आकार के उपसंगों के आधार पर क्रमबद्ध है।


Answer #2

यह समाधान चुने हुए उत्तर से अधिक विश्वसनीय है। यह जवाब संभवत: जवाब नहीं दे सकता है अगर 1 से अधिक संख्या में स्टेशन में 'ईपीए वेल 7 7' जैसे यह समाधान '0 के साथ संख्या में पैडिंग है, इसलिए तुलना सभी अंकों के 8 अंकों पर विचार करेगी।

DECLARE  @Table1 table([station] varchar(26))

INSERT INTO @Table1
    ([station])
VALUES
    ('ANTIL WELL 2'),
    ('ANTIL WELL 1'),
    ('BASELINE & CALIFORNIA WELL'),
    ('EPA WELL 7'),
    ('EPA WELL 6'),
    ('EPA WELL 108'),
    ('EPA WELL 109'),
    ('EPA WELL 110'),
    ('EPA WELL 111'),
    ('EPA WELL 112'),
    ('EPA WELL 108S'),
    ('EPA WELL 111108')
;

SELECT station
FROM @table1
ORDER BY 
CASE WHEN station not like '%[0-9]%' THEN station ELSE
   STUFF(station, PATINDEX('%[0-9]%',station), 0, replicate('0', 
   PATINDEX('%[0-9]%',station) - len(station) + PATINDEX('%[0-9]%',reverse(station)) + 6))
END

* गोट सीडी का जवाब मेरे परीक्षण डेटा में सही क्रम नहीं देगा।





natural-sort