我有一个字符串,如M1 M3 M4 M14 M30 M40
等(实际上任何一个字母后诠释2-3位) 当我做“ORDER BY名”这将返回:mysql命令通过串号
M1, M14, M3, M30, M4, M40
当我想:
M1, M3, M4, M14, M30, M40
它把整个事情作为一个字符串,但我希望把它当作字符串+ INT
任何想法?
我有一个字符串,如M1 M3 M4 M14 M30 M40
等(实际上任何一个字母后诠释2-3位) 当我做“ORDER BY名”这将返回:mysql命令通过串号
M1, M14, M3, M30, M4, M40
当我想:
M1, M3, M4, M14, M30, M40
它把整个事情作为一个字符串,但我希望把它当作字符串+ INT
任何想法?
您可以使用SUBSTR和CAST为无符号/签署ORDER内:
SELECT * FROM table_name ORDER BY
SUBSTR(col_name FROM 1 FOR 1),
CAST(SUBSTR(col_name FROM 2) AS UNSIGNED)
非常感谢!刚刚从1变为2变为1变为1并且工作 –
真棒回答...你让我的一天!谢谢! – Monica
@rocky如果没有修复甲酸盐,可能的字符串如何处理: test1,1test,te2st,test11,2131,10t,t22g –
如果可以在字符串的开头是多个字符,例如'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
声明。
它分开数字和字母。
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;
我不能让这对我的问题,这是整理MLS号码,如下面的工作:
V12345 V1000000 V92832
的问题V1000000没有被比估价高尽管它更大,但休息一下。
使用这个解决我的问题:
ORDER BY CAST(SUBSTR(col_name FROM 2) AS UNSIGNED) DESC
只是删除了SUBSTR(col_name FROM 1 FOR 1)
尝试用SUBSTR删除字符。然后使用ABS从现场得到的绝对值:
SELECT * FROM table ORDER BY ABS(SUBSTR(field,1));
http://stackoverflow.com/a/153642/1013082 – MetalFrog
会不会有永远只能是在字符串的开头一个字母? –
http://stackoverflow.com/a/12257917/2008111 – caramba