在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;
您可以使用SUBSTRING
和CONVERT
:
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