我有一个类型为varchar
的字段number
。尽管它是varchar
类型,但它存储具有可选前导零的整数值。排序按字典顺序排列("42"
在"9"
之前)。如何按数字值排序(使"9"
在"42"
之前)?
目前我使用以下查询:
SELECT * FROM table ORDER BY number ASC
我有一个类型为varchar
的字段number
。尽管它是varchar
类型,但它存储具有可选前导零的整数值。排序按字典顺序排列("42"
在"9"
之前)。如何按数字值排序(使"9"
在"42"
之前)?
目前我使用以下查询:
SELECT * FROM table ORDER BY number ASC
试一试这个
SELECT * FROM table_name ORDER BY CAST(field_name as SIGNED INTEGER) ASC
其实我发现了一些有趣的东西:
SELECT * FROM mytable ORDER BY LPAD(LOWER(mycol), 10,0) DESC
这可以让您按以下方式排序字段:
1
2
3
10
A
A1
B2
10A
111
00100
这样的带前导零的字符串。insert
/update
触发器,在字符串列更改时确保它正确设置。由于绝大多数数据库的读取远远多于写入,上述第三种选项将计算成本(在 insert
/update
时完成)分摊到所有选择中。您的选择将非常快,因为它们使用数字列进行排序(并且没有每行函数)。
您的插入和更新将会变慢,但这是您要付出的代价,老实说,这个代价非常值得。
触发器的使用维护了表的 ACID 属性,因为两列保持同步。而且众所周知,通常您可以在大多数性能优化中以空间换时间。
我们在许多情况下使用了这个 "技巧",例如将原始姓氏的小写版本(而不是使用类似 tolower
的东西)与其一起存储,标识字符串的长度以找到所有具有 7 个字符的用户(而不是使用 len),等等。
请记住,为了性能,从第三范式回退是可以接受的,前提是您理解并减轻了其后果。
我刚学会的一个技巧。在 varchar 字段的排序语句中添加 '+0':
SELECT * FROM table ORDER BY number+0 ASC
我现在看到了上面的答案。我想知道这是否是将字段和整数进行类型转换。我还没有进行性能比较。工作得很好。
SELECT * FROM table ORDER BY number + 0
对于类似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;
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
进行排序,但目前未定义为整数
。
另一种选项是将数字保持在顶部,然后按字母顺序排序。
IF(name + 0, name + 0, 9999999), name