在MySQL查询中将文本转换为数字

在MySQL查询中可以将文本转换为数字吗? 我有一个标识符列,其中包含一个名称和一个格式为“name-number”的数字。 该列具有VARCHARtypes。 我想根据数字对行进行sorting(具有相同名称的行),但列按字符顺序sorting,即

name-1 name-11 name-12 name-2 

如果我切的数字,我可以将'varchar'数字转换为'真正'的数字,并使用它来sorting行? 我想获得下面的命令。

 name-1 name-2 name-11 name-12 

我不能把这个数字表示为一个单独的列。

编辑2011-05-11 9:32

我find了以下解决scheme... ORDER BY column * 1 。 如果名称不包含任何数字,那么使用该解决scheme将会保存吗?

这应该工作:

 SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num FROM table ORDER BY num; 

您可以使用SUBSTRINGCONVERT

 SELECT stuff FROM table WHERE conditions ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER); 

其中name_column是具有“name-”值的列。 SUBSTRING在第六个字符(即“name-”前缀)之前删除所有内容,然后CONVERT将左边的内容转换为实数。

更新 :鉴于评论中的环境变化(即前缀可以是任何东西),你将不得不在混合中抛出一个LOCATE

 ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER); 

这当然假定非数字前缀中没有任何连字符,但相关的评论说:

name可以是字母的任何序列

所以这应该是一个安全的假设。

您可以使用CAST()将string转换为int。 例如SELECT CAST('123' AS INTEGER);

 SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num; 

要获得数字尝试与SUBSTRING_INDEX(field, '-', 1)然后转换。

如果你的主键是一个像格式的string

ABC / EFG / EE / 13/123(序号)
这种string可以很容易的用分隔符(“/”)进行sorting

我们可以使用下面的查询来对这种types的键进行sorting

 SELECT * FROM `TABLE_NAME` ORDER BY CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC 

只需使用CAST,

 CAST(column_name AS UNSIGNED) 

转换结果的types可以是以下值之一:

 BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL[(M[,D])] SIGNED [INTEGER] TIME UNSIGNED [INTEGER] 

一个通用的方法来做:

 SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC 

一个简单的方法SELECT'123'+ 0