是否可以在MySQL查询中将文本转换为数字? 我有一列带有标识符的列,该标识符由名称和数字组成,格式为"名称-数字"。 该列具有VARCHAR类型。 我想根据数字(具有相同名称的行)对行进行排序,但是根据do字符顺序对列进行排序,即
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。 如果名称中不包含任何数字,是否可以保存使用该解决方案?
名称完全是名称,也可以是任何字符? 我的意思是:它是一个字符串,长度为四个字符还是真名?
name可以是任何字母序列。
mysql自然排序的可能重复项
这应该工作:
您可以添加说明和文档链接吗?
我的字符串就像" name-abc12"。通过添加您的代码,它仅在"-"之后的初始字符不以字母开头时才有效。 @Marco您能告诉我一种无条件条件下忽略字母的方法吗?
@Eduardo我的查询应该在"-"之后获取字符串,并将其转换为数字(必须为数字)。就您而言,Id可能继续使用正则表达式...
@Marco正则表达式做到了,谢谢您的提示。
您可以使用SUBSTRING和CONVERT:
其中name_column是带有"名称-"值的列。 SUBSTRING删除第六个字符(即" name-"前缀)之前的所有内容,然后CONVERT将剩余的内容转换为实数。
更新:鉴于注释中环境的变化(即前缀可以是任何东西),您必须在组合中添加LOCATE:
当然,这假定非数字前缀中没有任何连字符,但相关注释指出:
name can be any sequence of letters
因此应该是一个安全的假设。
在回答我的评论时,他告诉我们名称可以是任何字符序列,因此我不确定您可以使用SUBSTRING(name_column, 6)。我知道,当他没有告诉我们这件事时,您就张贴了它。
@Marco:感谢您的注意,我添加了一个更新,该更新应注意有关前缀的新信息。但是,是的,您的SUBSTRING_INDEX更好。
只需使用CAST,
CAST(column_name AS UNSIGNED)
转换结果的类型可以是以下值之一:
您可以使用CAST()从字符串转换为int。例如SELECT CAST('123' AS INTEGER);
该版本特定吗?我需要使用SELECT CAST(123 AS SIGNED INTEGER);或SELECT CAST(123 AS UNSIGNED INTEGER);使其正常工作。
您确定ORDER BY使用num作为数字而不使用CONVERT吗?我不确定,但是可以。.我只是问自己:)
一种简单的方法SELECT'123'+ 0
尽管此代码可能有助于解决问题,但是提供有关为什么和/或如何回答问题的其他上下文将显着提高其长期价值。请编辑您的答案以添加一些说明。
这没有回答问题,但这是我一直在寻找的答案。
您的解决方案是最优雅,最实用的解决方案-不幸的是,您没有在问题的上下文中提供给定示例的特定表达方式-请对其进行修改以使其更加具体。
如果您的主键是格式如下的字符串
ABC / EFG / EE / 13/123(序列号)
这种字符串可以很容易地用delimiter(" /")进行排序
我们可以使用以下查询来订购具有此类键的表
要获取数字,请尝试使用SUBSTRING_INDEX(field, '-', 1),然后进行转换。
您需要将1更改为-1。 dev.mysql.com/doc/refman/5.0/en/
通用方法:
SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC