2013-11-27 3 views
12

मैं अपनी तालिका में मान निम्न है:एसक्यूएल सर्वर 2008 - आदेश संख्या के साथ तार द्वारा संख्यानुसार

ABC 
ABC1 
ABC2 
ABC3 and so on... 

ABC11 
ABC12 
ABC13 and so on.. 

ABC20 
ABC21 
ABC22 and so on.. 

तो बुनियादी तौर पर मैं क्या किसी भी स्ट्रिंग मान (हमेशा एबीसी, किसी भी स्ट्रिंग मान) है कि या तो किया जा सकता है संख्या के बाद या यह संख्या के बिना एक स्ट्रिंग हो सकता है।

परिणाम जब मैं अपने कॉलम एएससी द्वारा तालिका आदेश से * का चयन करना मैं निम्नलिखित हो:

ABC 
ABC1 
ABC11 
ABC12 
ABC13 
ABC2 
ABC20 
ABC21 
ABC22 
ABC3 
ABC31 
ABC32 

मैं इसे संख्यानुसार हल कर की जरूरत है:

ABC 
ABC1 
ABC2 
ABC3 
ABC11 
ABC12 
ABC13 
ABC20 
ABC21 
ABC22 
ABC31 
ABC32 

यह कैसे पूरा किया जा सकता?

+0

किसी भी विचार कैसे अंत में कई पात्रों numerics हो सकता है? – DarkKnight

+3

और एबी 1 एबीसी 1 बनाम कहां फिट है? पहले और बादमे? - बेस्ट शर्त, मैं कहूंगा कि इस तरह की चीजों पर सॉर्टिंग से बचने के लिए एक सॉर्टिंग कॉलम बनाए रखना है। क्योंकि आप जल्दी से एक जटिल क्रम के साथ समाप्त हो सकते हैं जिससे आपकी क्वेरी को धीमा कर दिया जाएगा। –

+3

तो 'एबीसी' वास्तव में किसी भी लंबाई के साथ कोई स्ट्रिंग हो सकता है? क्या इसमें संख्यात्मक वर्ण भी हो सकते हैं, उदा। 'A1B2C1234'? यदि हां, तो आप इसे कैसे क्रमबद्ध करना चाहते हैं? –

उत्तर

6

आप पहले तीन पात्रों को हटाने और int

SELECT Value, 
     Num=CAST(RIGHT(Value, LEN(Value) - 3) AS int) 
FROM dbo.TableName 
ORDER BY Num 

Demo

+2

अच्छा समाधान, यदि स्ट्रिंग में हमेशा लंबाई 3 है - प्रश्न में शब्द का सुझाव है कि यह मामला नहीं है ... – Josien

+1

यह केवल 3 वर्ण स्ट्रिंग के लिए काम करेगा, यह "एबीसीडी 11" –

+0

जैसे स्ट्रिंग के लिए काम नहीं करेगा @ उपेंद्र चौधरी: हां, जोसियन ने पहले ही उल्लेख किया है। मैंने उस हिस्से को अनदेखा कर दिया है कि स्ट्रिंग मनमाने ढंग से है। –

2

को आराम डाली सकता है तो आप समारोह खुद को अनुकूलित कर RemoveNonAlphaCharacters this answer में संख्या के अलावा सब कुछ बाहर फिल्टर करने के लिए, और उस फ़ंक्शन का उपयोग करके ORDER BY का उपयोग करें।

11

आप नीचे दिए गए जैसे PATINDEX() फ़ंक्शन का उपयोग कर ऐसा कर सकते हैं:

select * from Test 
order by CAST(SUBSTRING(Name + '0', PATINDEX('%[0-9]%', Name + '0'), LEN(Name + '0')) AS INT) 

SQL Fiddle Demo

आप स्ट्रिंग के बीच में संख्या है तो आप प्राप्त करने के लिए छोटे उपयोगकर्ता परिभाषित समारोह बनाने की जरूरत उस संख्या के आधार पर स्ट्रिंग और सॉर्ट डेटा से संख्या:

CREATE FUNCTION dbo.fnGetNumberFromString (@strInput VARCHAR(255)) 
RETURNS VARCHAR(255) 
AS 
BEGIN 
    DECLARE @intNumber int 
    SET @intNumber = PATINDEX('%[^0-9]%', @strInput) 

    WHILE @intNumber > 0 
    BEGIN 
     SET @strInput = STUFF(@strInput, @intNumber, 1, '') 
     SET @intNumber = PATINDEX('%[^0-9]%', @strInput) 
    END 

    RETURN ISNULL(@strInput,0) 
END 
GO 

आप डेटा बी को सॉर्ट कर सकते हैं y:

select Name from Test order by dbo.fnGetNumberFromString(Name), Name 
+0

ओह, अच्छा एक, +1! जब तक स्ट्रिंग हिस्सा पहले आता है तब तक ठीक काम करता है और संख्या भाग आखिरी बार आता है। – Josien

+0

यह मेरे लिए बहुत अच्छा काम करेगा यदि मेरे सभी मान प्रारूप में थे: स्ट्रिंगनंबर, हालांकि मेरे पास कुछ मूल्य हैं जैसे AD2_NDU, ECOS_10_CHANGEOFSTATUS, आदि।और इन मानों के लिए त्रुटियों के ऊपर समाधान ... क्या ऐसा कुछ है जिसे केवल इस प्रारूप को लागू करने के लिए जोड़ा जा सकता है जो संख्याओं के साथ समाप्त होता है? – user2179092

+0

यदि कोई नहीं है। स्ट्रिंग के बीच में इसे कैसे क्रमबद्ध करना चाहिए? यानी इन नंबरों में पहले कौन आएगा? "AD2_NDU" या "एबीसी" या "ABC1" या "ABC2" –

2

आदेश में बयान से, आगे जोड़ते जब मूल्य उस में किसी भी संख्या में शामिल हैं के साथ पर्याप्त शून्य बनाने के लिए alphanumerica सभी मूल्य एक ही लंबाई

SELECT ColName 
FROM TableName 
ORDER BY 
CASE WHEN ColName like '%[0-9]%' 
THEN Replicate('0', 100 - Len(ColName)) + ColName 
ELSE ColName END 
संबंधित मुद्दे