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

时间:2011-05-11 07:18:54

标签: mysql sql

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

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

如果我剪切了数字,我可以将'varchar'数字转换为'真实'数字并用它来排序行吗?我想获得以下订单。

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

我无法将该数字表示为单独的列。

编辑2011-05-11 9:32

我找到了以下解决方案... ORDER BY column * 1。如果名称不包含任何数字,是否保存以使用该解决方案?

12 个答案:

答案 0 :(得分:228)

这应该有效:

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

答案 1 :(得分:29)

您可以使用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可以是任何字母序列

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

答案 2 :(得分:13)

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

答案 3 :(得分:10)

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

答案 4 :(得分:10)

只需使用CAST,

CAST(column_name AS UNSIGNED)

投射结果的类型可以是以下值之一:

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

答案 5 :(得分:2)

要使用SUBSTRING_INDEX(field, '-', 1)获取号码,请转换。

答案 6 :(得分:2)

如果你的主键是一个格式如下的字符串

ABC / EFG / EE / 13/123(序列号)
这种字符串可以很容易地用分隔符(“/”)

进行排序

我们可以使用以下查询来订购具有此类密钥的表

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

cast(REGEXP_REPLACE(NameNumber, '[^0-9]', '') as UNSIGNED)

答案 9 :(得分:0)

我发现使用 regex_replace 函数从字段中去除所有非数字值然后排序更容易。

SELECT field , CONVERT(REGEXP_REPLACE(field,'[^0-9]',''),UNSIGNED) AS num FROM your_table ORDER BY num;

答案 10 :(得分:-1)

通用方法:

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

答案 11 :(得分:-2)

select
    `a`.uuid,
    concat('1',REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(`a`.uuid,'-',''),'b','11'),'c','12'),'d','13'),'e','14'),'f','15'),'a','10')),