在MySQL中对varchar字段进行数字sorting
我有一个types为varchar
的字段number
。 即使它是varchar
types,它也会存储整数值和可选的前导零。 sorting按字典顺序排列( "42"
在"9"
之前)。 我怎样才能按数字值( "9"
来到"42"
之前)?
目前我使用查询:
SELECT * FROM table ORDER BY number ASC
有几种方法可以做到这一点:
- 将它们存储为数字值而不是string。 你已经打了折扣,因为你想保持string
00100
完整的前导零。 - 按string的顺序排列为数字。 这将工作,但要知道,这是体面的大小的数据库的性能杀手。 每行函数并不能很好地扩展。
- 添加第三列,这是相当于该string和索引的数字。 然后使用插入/更新触发器来确保在string列更改时正确设置。
由于绝大多数数据库的读取次数多于写入次数,所以上面的第三个选项将计算(在插入/更新时完成的)所有select的成本进行分摊。 您的select将会非常快速,因为它们使用数字列来sorting(并且没有每行function)。
您的插入和更新速度会更慢,但这是您付出的代价,说实话,这是值得的。
触发器的使用维护了表的ACID属性,因为两列保持一致。 这是一个众所周知的习惯用法,你通常可以在大多数性能优化方面为时间换取空间。
在许多情况下,我们使用这种“技巧”,例如在原件旁边存储较低版本的姓(而不是使用像tolower
这样的东西),识别string的长度以find具有7个字符的所有用户(而不是使用len
)等等。
请记住,只要您了解(并减轻)后果,就可以从第三种正常forms恢复正常forms。
尝试这个
SELECT * FROM table_name ORDER BY CAST(field_name as SIGNED INTEGER) ASC
其实我find了一些有趣的东西:
SELECT * FROM mytable ORDER BY LPAD(lower(mycol), 10,0) DESC
这样可以让您按照以下顺序排列字段:
1 2 3 10 A A1 B2 10A 111
SELECT * FROM table ORDER BY number + 0
捣蛋我刚刚学会了。 将“+0”添加到varchar字段顺序子句中:
SELECT * FROM table ORDER BY number+0 ASC
我现在看到上面的答案。 我想知道如果这是typecasting字段和一个整数。 我没有比较performance。 工作很好。
对于有Er353,ER280,ER30,ER36等值的表,默认sorting为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
你可以按照你的要求使用下面的sql查询来获得订单
SELECT * FROM mytable ORDER BY ABS(mycol)
给出一个包含VARCHAR
的列username
如下所示:
username1 username10 username100
人们可以这样做:
SELECT username, CONVERT(REPLACE(username, 'username', ''), UNSIGNED INTEGER) AS N FROM users u WHERE username LIKE 'username%' ORDER BY N;
这不便宜,但是做这个工作。
SELECT * FROM table ORDER BY number ASC
应该显示你想要它显示..看起来像你正在按id
或number
sorting目前没有定义为integer
。
粗糙和准备:按1 * field_namesorting