我有number
类型的字段varchar
。即使它是varchar
类型,它也存储带有可选前导零的整数值。排序按字典顺序排序("42"
在"9"
之前)。如何通过数字值("9"
之前的"42"
)订购?
目前我使用的是查询:
SELECT * FROM table ORDER BY number ASC
答案 0 :(得分:67)
试试这个
SELECT * FROM table_name ORDER BY CAST(field_name as SIGNED INTEGER) ASC
答案 1 :(得分:37)
有几种方法可以做到这一点:
00100
之类的字符串保留为前导零。insert
/ update
触发器确保在字符串列发生更改时正确设置。由于绝大多数数据库的阅读频率远高于书面数据,因此上面的第三个选项会在所有选择中分摊计算成本(在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
排序