2012-08-23 79 views
11

我有一個字符串,如M1 M3 M4 M14 M30 M40等(實際上任何一個字母后詮釋2-3位) 當我做「ORDER BY名」這將返回:mysql命令通過串號

M1, M14, M3, M30, M4, M40

當我想:

M1, M3, M4, M14, M30, M40 它把整個事情作爲一個字符串,但我希望把它當作字符串+ INT

任何想法?

+0

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

+0

會不會有永遠只能是在字符串的開頭一個字母? –

+0

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

回答

10

您可以使用SUBSTR和CAST爲無符號/簽署ORDER內:

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個字符的字符串的所提取的數量的部字符串的開始。如果您需要更多,您可以將其他WHEN s鏈接到CASE聲明。

+0

爲我工作。謝謝:) –

+0

它的工作,但如何訂購,如果它的數值如:'M10','40','MTR10','ABCD50','8','JL8','55' – sytolk

+0

其需要添加ORDER BY名* 1,CASE ..在第一個CASE工作之前,如果它的數字與混合字符串之間有乾淨的數字。 – 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

我不能讓這對我的問題,這是整理MLS號碼,如下面的工作:

V12345 V1000000 V92832

的問題V1000000沒有被比估價高儘管它更大,但休息一下。

使用這個解決我的問題:

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

只是刪除了SUBSTR(col_name FROM 1 FOR 1)

0

嘗試用SUBSTR刪除字符。然後使用ABS從現場得到的絕對值:

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