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


138

是否可以在MySQL查询中将文本转换为数字?我有一列带有标识符的列,该标识符由名称和数字组成,格式为“名称-数字”。该列具有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。如果名称不包含任何数字,是否可以保存使用该解决方案?


1
名称完全是名称,也可以是任何字符?我的意思是:它是一个字符串,长度为四个字符还是真名?
马可(Marco)

name可以是任何字母序列。
czuk

Answers:


256

这应该工作:

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

1
您可以添加说明和文档链接吗?
Angelo Fuchs

我的字符串就像“ name-abc12”。通过添加您的代码,它仅在“-”之后的初始字符不以字母开头时才有效。@Marco您能告诉我一种无条件条件下忽略字母的方法吗?
爱德华多

1
@Eduardo我的查询应该在“-”之后获取字符串,并将其转换为数字(必须为数字)。在您的情况下,我可能会继续使用正则表达式……
Marco Marco

@Marco正则表达式做到了,谢谢您的提示。
爱德华多

32

您可以使用SUBSTRINGCONVERT

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

name_column带有“名称-”值的列在哪里。在SUBSTRING移除了一切了第六个字符之前(即“名称- ”前缀),然后CONVERT转换遗留到一个真正的整数。

更新:鉴于注释中环境的变化(即前缀可以是任何东西),您必须LOCATE在组合中添加:

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

当然,这假定非数字前缀中没有任何连字符,但相关注释指出:

name 可以是任何字母序列

因此应该是一个安全的假设。


在回答我的评论时,他告诉我们名称可以是任何字符序列,因此我不确定您可以使用SUBSTRING(name_column, 6)。我知道,当他不告诉我们时,您就张贴了它
马克·马可(Marco)

@Marco:感谢您的注意,我添加了一个更新,该更新应注意有关前缀的新信息。但是,是的,您的SUBSTRING_INDEX更好。
亩太短了,

23

只需使用CAST,

CAST(column_name AS UNSIGNED)

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

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

14

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


15
该版本特定吗?我需要使用SELECT CAST('123' AS SIGNED INTEGER);SELECT CAST('123' AS UNSIGNED INTEGER);使其正常工作。
Hobo 2013年

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

1
您确定ORDER BY使用num作为数字而不使用CONVERT吗?我不确定,但是可以。.我只是问自己:)
Marco Marco

4

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


尽管此代码可能有助于解决问题,但是提供有关为什么和/或如何回答问题的其他上下文将显着提高其长期价值。请编辑您的答案以添加一些解释。
Toby Speight

这没有回答问题,但这是我一直在寻找的答案。
萨加尔·沙

您的解决方案是最优雅,最实用的解决方案-不幸的是,您没有在问题的上下文中提供给定示例的特定表达方式-请将其修改为特定的。
chukko


2

如果您的主键是格式为

ABC / EFG / EE / 13/123(序列号)
的字符串,则这种字符串可以很容易地用delimiter(“ /”)进行排序

我们可以使用以下查询来订购具有这种类型的键的表

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


-5

通用方法:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.