我有一个领域 number 类型 varchar . 即使是那种 varchar ,它存储带可选前导零的整数值。一种按字典顺序排列的方法( "42" 在前面 "9" ). 如何按数值排序( "9" 走在前面 "42" )?目前我使用的查询:
number
varchar
"42"
"9"
SELECT * FROM table ORDER BY number ASC
i34xakig1#
应该显示您希望它显示的内容。。看起来你在按 id 或者 number 不定义为 integer 目前。
id
integer
slhcrj9b2#
您可以根据您的要求使用下面的sql查询得到订单
SELECT * FROM mytable ORDER BY ABS(mycol)
hpcdzsge3#
对于值为er353、er280、er30、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
qv7cva1a4#
mysql按正确的顺序排列字母数字
例子:
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
lrl1mhuk5#
实际上我发现了一些有趣的事情:
SELECT * FROM mytable ORDER BY LPAD(LOWER(mycol), 10,0) DESC
这允许您对字段进行如下排序:
1 2 3 10 A A1 B2 10A 111
mu0hgdu06#
准备就绪:按1*字段名称订购
v1l68za47#
我刚学的把戏。将“+0”添加到varchar field order子句:
SELECT * FROM table ORDER BY number+0 ASC
我现在看到了上面的答案。我想知道这是否是类型转换字段和整数。我没有比较过表现。干得不错。
5m1hhzi48#
试试这个
SELECT * FROM table_name ORDER BY CAST(field_name as SIGNED INTEGER) ASC
dldeef679#
SELECT * FROM table ORDER BY number + 0
btqmn9zl10#
有几种方法可以做到这一点:将它们存储为数值而不是字符串。你已经打折了,因为你想保持这样的字符串 00100 完整的带前导零。按转换为数字的字符串排序。这是可行的,但请注意,它是相当大的数据库的性能杀手。每行函数的伸缩性不是很好。添加第三列,该列的数值等效于该列上的字符串和索引。然后使用 insert / update 触发器以确保在字符串列更改时正确设置。由于绝大多数数据库的读取频率远远高于写入频率,因此上面的第三个选项将摊销计算成本(在 insert / update )所有的选择。您的选择速度会非常快,因为它们使用数字列进行排序(并且没有每行函数)。你的插入和更新会慢一些,但这是你付出的代价,老实说,这是值得付出的。触发器的使用保持了表的acid属性,因为这两列保持同步。在大多数性能优化中,通常可以用空间来换取时间,这是一个众所周知的习惯用法。我们已经在很多情况下使用了这个“技巧”,比如在原始姓氏旁边存储小写版本的姓氏(而不是使用类似 tolower ),用于查找具有7个字符的所有用户的标识字符串的长度(而不是使用 len )等等。请记住,只要您了解(并减轻)后果,就可以从性能的第三标准形式恢复。
00100
insert
update
tolower
len
hmae6n7t11#
给定一列 username 包含 VARCHAR 是这样的:
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;
它不便宜,但很管用。
11条答案
按热度按时间i34xakig1#
应该显示您希望它显示的内容。。看起来你在按
id
或者number
不定义为integer
目前。slhcrj9b2#
您可以根据您的要求使用下面的sql查询得到订单
hpcdzsge3#
对于值为er353、er280、er30、er36的表,默认排序将给出er280 er30 er353 er36
结果将按以下顺序排列:er30 er36 er280 er353
qv7cva1a4#
mysql按正确的顺序排列字母数字
例子:
输出:
lrl1mhuk5#
实际上我发现了一些有趣的事情:
这允许您对字段进行如下排序:
mu0hgdu06#
准备就绪:按1*字段名称订购
v1l68za47#
我刚学的把戏。将“+0”添加到varchar field order子句:
我现在看到了上面的答案。我想知道这是否是类型转换字段和整数。我没有比较过表现。干得不错。
5m1hhzi48#
试试这个
dldeef679#
btqmn9zl10#
有几种方法可以做到这一点:
将它们存储为数值而不是字符串。你已经打折了,因为你想保持这样的字符串
00100
完整的带前导零。按转换为数字的字符串排序。这是可行的,但请注意,它是相当大的数据库的性能杀手。每行函数的伸缩性不是很好。
添加第三列,该列的数值等效于该列上的字符串和索引。然后使用
insert
/update
触发器以确保在字符串列更改时正确设置。由于绝大多数数据库的读取频率远远高于写入频率,因此上面的第三个选项将摊销计算成本(在
insert
/update
)所有的选择。您的选择速度会非常快,因为它们使用数字列进行排序(并且没有每行函数)。你的插入和更新会慢一些,但这是你付出的代价,老实说,这是值得付出的。
触发器的使用保持了表的acid属性,因为这两列保持同步。在大多数性能优化中,通常可以用空间来换取时间,这是一个众所周知的习惯用法。
我们已经在很多情况下使用了这个“技巧”,比如在原始姓氏旁边存储小写版本的姓氏(而不是使用类似
tolower
),用于查找具有7个字符的所有用户的标识字符串的长度(而不是使用len
)等等。请记住,只要您了解(并减轻)后果,就可以从性能的第三标准形式恢复。
hmae6n7t11#
给定一列
username
包含VARCHAR
是这样的:我们可以做到:
它不便宜,但很管用。