2012-08-23 82 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));