2012-08-23 14 views
11

मैं (वास्तव में किसी भी एक पत्र के बाद 2-3 अंक int) जब मैं "द्वारा नाम आदेश" ऐसा करते हैं रिटर्न इस तरह के M1 M3 M4 M14 M30 M40 आदि के रूप में तार है:MySQL आदेश

M1, M14, M3, M30, M4, M40

जब मैं चाहता हूँ:

M1, M3, M4, M14, M30, M40 यह एक स्ट्रिंग के रूप में पूरी बात के इलाज लेकिन मैं स्ट्रिंग + पूर्णांक

कोई भी विचार के रूप में यह इलाज के लिए करना चाहते हैं?

+0

http://stackoverflow.com/a/153642/1013082 – MetalFrog

+0

वहाँ हमेशा केवल स्ट्रिंग की शुरुआत में एक पत्र होगा? –

+0

http://stackoverflow.com/a/12257917/2008111 – caramba

उत्तर

10

आप substr का उपयोग करें और द्वारा आदेश के भीतर के रूप में अहस्ताक्षरित/हस्ताक्षर कास्ट सकता है:

SELECT * FROM table_name ORDER BY 
    SUBSTR(col_name FROM 1 FOR 1), 
    CAST(SUBSTR(col_name FROM 2) AS UNSIGNED) 
+0

बहुत अच्छा काम करता है! बस 1 से 2 के लिए 1 से 1 में बदल गया है और –

+0

अद्भुत उत्तर देता है ... आपने मेरा दिन बनाया! धन्यवाद! – Monica

+1

@rocky यदि कोई फिक्स फॉर्मेट नहीं है, तो संभव स्ट्रिंग पसंद है: test1,1test, te2st, test11,2131,10t, t22g –

1

आप उपयोग कर सकते हैं:

order by name,SUBSTRING(name,1,LENGTH(name)-1) 
+0

मेरे लिए यह सही समाधान है। धन्यवाद! – Stimart

3

अगर कोई स्ट्रिंग की शुरुआत में कई पात्रों हो सकता है, के लिए उदाहरण 'M10', 'MTR10', 'ABCD50', 'JL8', etc... जैसे, आपको मूल रूप से किसी संख्या की पहली स्थिति से नाम का सबस्ट्रिंग प्राप्त करना होगा।

दुर्भाग्यवश MySQL उस प्रकार के REGEXP ऑपरेशन का समर्थन नहीं करता है (केवल एक बूलियन मान लौटाया जाता है, वास्तविक मिलान नहीं)।

आप इस समाधान का उपयोग कर सकते हैं यह अनुकरण करने के लिए:

SELECT name 
FROM  tbl 
ORDER BY CASE WHEN ASCII(SUBSTRING(name,1)) BETWEEN 48 AND 57 THEN 
        CAST(name AS UNSIGNED) 
       WHEN ASCII(SUBSTRING(name,2)) BETWEEN 48 AND 57 THEN 
        SUBSTRING(name,1,1) 
       WHEN ASCII(SUBSTRING(name,3)) BETWEEN 48 AND 57 THEN 
        SUBSTRING(name,1,2) 
       WHEN ASCII(SUBSTRING(name,4)) BETWEEN 48 AND 57 THEN 
        SUBSTRING(name,1,3) 
       WHEN ASCII(SUBSTRING(name,5)) BETWEEN 48 AND 57 THEN 
        SUBSTRING(name,1,4) 
       WHEN ASCII(SUBSTRING(name,6)) BETWEEN 48 AND 57 THEN 
        SUBSTRING(name,1,5) 
       WHEN ASCII(SUBSTRING(name,7)) BETWEEN 48 AND 57 THEN 
        SUBSTRING(name,1,6) 
       WHEN ASCII(SUBSTRING(name,8)) BETWEEN 48 AND 57 THEN 
        SUBSTRING(name,1,7) 
     END, 
     CASE WHEN ASCII(SUBSTRING(name,1)) BETWEEN 48 AND 57 THEN 
        CAST(SUBSTRING(name,1) AS UNSIGNED) 
       WHEN ASCII(SUBSTRING(name,2)) BETWEEN 48 AND 57 THEN 
        CAST(SUBSTRING(name,2) AS UNSIGNED) 
       WHEN ASCII(SUBSTRING(name,3)) BETWEEN 48 AND 57 THEN 
        CAST(SUBSTRING(name,3) AS UNSIGNED) 
       WHEN ASCII(SUBSTRING(name,4)) BETWEEN 48 AND 57 THEN 
        CAST(SUBSTRING(name,4) AS UNSIGNED) 
       WHEN ASCII(SUBSTRING(name,5)) BETWEEN 48 AND 57 THEN 
        CAST(SUBSTRING(name,5) AS UNSIGNED) 
       WHEN ASCII(SUBSTRING(name,6)) BETWEEN 48 AND 57 THEN 
        CAST(SUBSTRING(name,6) AS UNSIGNED) 
       WHEN ASCII(SUBSTRING(name,7)) BETWEEN 48 AND 57 THEN 
        CAST(SUBSTRING(name,7) AS UNSIGNED) 
       WHEN ASCII(SUBSTRING(name,8)) BETWEEN 48 AND 57 THEN 
        CAST(SUBSTRING(name,8) AS UNSIGNED) 
     END 

यह तो स्ट्रिंग के निकाले संख्या भाग के रूप में लंबे समय के रूप में वहाँ पर < = 7 चरित्र, पहली स्ट्रिंग के चरित्र हिस्सा द्वारा आदेश देगा स्ट्रिंग की शुरुआत। यदि आपको और ज़्यादा चाहिए, तो आप CASE कथन में अतिरिक्त WHEN से श्रृंखला का चयन कर सकते हैं।

+0

मेरे लिए काम किया। धन्यवाद :) –

+0

यह काम करता है लेकिन अगर उसके पास संख्या मान हैं: 'एम 10', '40', 'एमटीआर 10', 'एबीसीडी 50', '8', 'जेएल 8', '55' – sytolk

+0

ऑर्डर जोड़ने की आवश्यकता है नाम * 1, केस .. द्वारा पहले केस को काम करने से पहले यदि उसके पास संख्याओं के साथ मिश्रित स्ट्रिंग के बीच साफ संख्या है। – sytolk

0

यह संख्या और अक्षरों को अलग से विभाजित करता है।

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(
SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(col,'1', 1), '2', 1), '3', 1), '4', 1), '5', 1), '6', 1) 
, '7', 1), '8', 1), '9', 1), '0', 1) as new_col 
FROM table group by new_col; 
1

मैं इससे मेरी समस्या का जो नीचे की तरह एमएलएस संख्या छँटाई गया था के लिए काम नहीं मिल सका:

V12345 V1000000 V92832

समस्या था V1000000 की तुलना में अधिक महत्वपूर्ण नहीं किया जा रहा था बाकी है हालांकि यह बड़ा है।

ORDER BY CAST(SUBSTR(col_name FROM 2) AS UNSIGNED) DESC 

बस हटा दिया SUBSTR(col_name FROM 1 FOR 1)

0

substr के साथ चरित्र को दूर का प्रयास करें:

इस का उपयोग करते हुए मेरी समस्या हल। तब क्षेत्र से निरपेक्ष मूल्य प्राप्त करने के लिए एबीएस का उपयोग करें:

SELECT * FROM table ORDER BY ABS(SUBSTR(field,1));