在MySQL中以数字方式对varchar字段进行排序

时间:2011-01-14 00:22:05

标签: mysql sorting

我有number类型的字段varchar。即使它是varchar类型,它也存储带有可选前导零的整数值。排序按字典顺序排序("42""9"之前)。如何通过数字值("9"之前的"42")订购?

目前我使用的是查询:

SELECT * FROM table ORDER BY number ASC

11 个答案:

答案 0 :(得分:67)

试试这个

SELECT * FROM table_name ORDER BY CAST(field_name as SIGNED INTEGER) ASC

答案 1 :(得分:37)

有几种方法可以做到这一点:

  1. 将它们存储为数字值而不是字符串。您已经打了折扣,因为您希望将00100之类的字符串保留为前导零。
  2. 按强制转换为数字的字符串排序。这将有效,但要注意它是适合大小合适的数据库的性能杀手。每行功能无法很好地扩展。
  3. 添加第三列,该列是字符串和索引的数字等效项。然后使用insert / update触发器确保在字符串列发生更改时正确设置。
  4. 由于绝大多数数据库的阅读频率远高于书面数据,因此上面的第三个选项会在所有选择中分摊计算成本(在insert / update处完成)。您的选择将非常快,因为它们使用数字列进行排序(并且没有按行功能)。

    您的插入和更新速度会变慢,但这是您支付的价格,说实话,这非常值得付费。

    使用触发器可以保持表的ACID属性,因为两列是保持一致的。这是一个众所周知的习惯用法,在大多数性能优化中,你通常可以在空间中进行权衡。

    我们在很多情况下都使用过这种“伎俩”,比如将原始的低位版本的姓氏存储起来(而不是使用类似tolower之类的东西),识别字符串的长度以找到所有7用户 - 字符(而不是使用len)等等。

    请记住,只要您理解(并减轻)后果,就可以从第三范式恢复表现。

答案 2 :(得分:27)

实际上我发现了一些有趣的东西:

SELECT * FROM mytable ORDER BY LPAD(LOWER(mycol), 10,0) DESC

这允许您订购字段,如:

1
2
3
10
A
A1
B2
10A
111

答案 3 :(得分:19)

SELECT * FROM table ORDER BY number + 0

答案 4 :(得分:16)

诡计我刚刚学会了。将“+0”添加到varchar字段顺序子句:

SELECT * FROM table ORDER BY number+0 ASC

我现在看到上面这个答案。我想知道这是否是字段和整数的类型转换。我没有比较性能。工作得很好。

答案 5 :(得分:5)

对于具有Er353,ER 280,ER 30,ER36等值的表格 默认排序将给出 ER280 ER30 ER353 ER36

SELECT fieldname, SUBSTRING(fieldname, 1, 2) AS bcd, 
CONVERT(SUBSTRING(fieldname, 3, 9), UNSIGNED INTEGER) AS num 
FROM table_name
ORDER BY bcd, num;

结果将按此顺序排列 ER30 ER36 ER280 ER353

答案 6 :(得分:1)

您可以根据您的要求使用以下sql查询获取订单

SELECT * FROM mytable ORDER BY ABS(mycol)

答案 7 :(得分:1)

给出包含username的列VARCHAR,如下所示:

username1
username10
username100

可以做到:

SELECT username,
CONVERT(REPLACE(username, 'username', ''), UNSIGNED INTEGER) AS N
FROM users u
WHERE username LIKE 'username%'
ORDER BY N;

它并不便宜,但能胜任。

答案 8 :(得分:0)

SELECT * FROM table ORDER BY number ASC

应显示您想要显示的内容..看起来您要按id对其进行排序,或者number目前尚未定义为integer

答案 9 :(得分:0)

MySQL ORDER BY以正确的顺序对字母数字进行排序

示例:

SELECT `alphanumericCol` FROM `tableName` ORDER BY 
  SUBSTR(`alphanumericCol` FROM 1 FOR 1), 
  LPAD(lower(`alphanumericCol`), 10,0) ASC

输出:

0
1
2
11
21
100
101
102
104
S-104A
S-105
S-107
S-111

答案 10 :(得分:-3)

粗糙且准备就绪:按1 * field_name

排序