mysql中varchar字段的数值排序

ecfdbz9o  于 2021-06-17  发布在  Mysql
关注(0)|答案(11)|浏览(381)

我有一个领域 number 类型 varchar . 即使是那种 varchar ,它存储带可选前导零的整数值。一种按字典顺序排列的方法( "42" 在前面 "9" ). 如何按数值排序( "9" 走在前面 "42" )?
目前我使用的查询:

SELECT * FROM table ORDER BY number ASC
i34xakig

i34xakig1#

SELECT * FROM table ORDER BY number ASC

应该显示您希望它显示的内容。。看起来你在按 id 或者 number 不定义为 integer 目前。

slhcrj9b

slhcrj9b2#

您可以根据您的要求使用下面的sql查询得到订单

SELECT * FROM mytable ORDER BY ABS(mycol)
hpcdzsge

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

qv7cva1a

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
lrl1mhuk

lrl1mhuk5#

实际上我发现了一些有趣的事情:

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

这允许您对字段进行如下排序:

1
2
3
10
A
A1
B2
10A
111
mu0hgdu0

mu0hgdu06#

准备就绪:按1*字段名称订购

v1l68za4

v1l68za47#

我刚学的把戏。将“+0”添加到varchar field order子句:

SELECT * FROM table ORDER BY number+0 ASC

我现在看到了上面的答案。我想知道这是否是类型转换字段和整数。我没有比较过表现。干得不错。

5m1hhzi4

5m1hhzi48#

试试这个

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

dldeef679#

SELECT * FROM table ORDER BY number + 0
btqmn9zl

btqmn9zl10#

有几种方法可以做到这一点:
将它们存储为数值而不是字符串。你已经打折了,因为你想保持这样的字符串 00100 完整的带前导零。
按转换为数字的字符串排序。这是可行的,但请注意,它是相当大的数据库的性能杀手。每行函数的伸缩性不是很好。
添加第三列,该列的数值等效于该列上的字符串和索引。然后使用 insert / update 触发器以确保在字符串列更改时正确设置。
由于绝大多数数据库的读取频率远远高于写入频率,因此上面的第三个选项将摊销计算成本(在 insert / update )所有的选择。您的选择速度会非常快,因为它们使用数字列进行排序(并且没有每行函数)。
你的插入和更新会慢一些,但这是你付出的代价,老实说,这是值得付出的。
触发器的使用保持了表的acid属性,因为这两列保持同步。在大多数性能优化中,通常可以用空间来换取时间,这是一个众所周知的习惯用法。
我们已经在很多情况下使用了这个“技巧”,比如在原始姓氏旁边存储小写版本的姓氏(而不是使用类似 tolower ),用于查找具有7个字符的所有用户的标识字符串的长度(而不是使用 len )等等。
请记住,只要您了解(并减轻)后果,就可以从性能的第三标准形式恢复。

hmae6n7t

hmae6n7t11#

给定一列 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;

它不便宜,但很管用。

相关问题