MySQL 使用字母数字前缀排序
MySQL sorting with alphanumeric prefix
我有一个数据库,其中有一列包含以下数据:
aaa-1
aaa-2
aaa-3
...
aaa-10
aaa-11
...
aaa-100
aaa-101
...
aaa-1000
当我按升序查询和排序数据时,我得到:
aaa-1
aaa-10
aaa-11
...
aaa-100
aaa-101
...
aaa-1000
...
aaa-2
...
aaa-3
这实际上是正确的(机器)排序方式吗?订单是否因为 aaa-
前缀而被搞砸了?我该如何按照人类的方式对其进行排序(即看起来像第一个片段的东西)?
P.S。如果问题确实出在前缀上,是否有办法将其删除并仅使用数字部分进行排序?
P.P.S。有人向我建议我应该只更改我的数据并添加前导零,例如 aaa-0001
和 aaa-0002
等。但是,每次列表上升一个顺序时,我都不愿意采用这种方法的 10,我必须重新格式化此列。
提前谢谢大家! :)
我给你一个样本排序。不是基于您的数据样本,但这可以帮助您。
假设您有这样的数据:
id
----
1
2
6
10
13
当你做 ORDER BY id ASC
时会 return :
id
----
1
10
13
2
6
我建议,使用LPAD
。
此查询:SELECT LPAD('12',5,'0')
return 00012
所以当你有像我上面提供的 table 数据时,你可以像这样对它们进行排序:
SELECT * FROM TABLE
ORDER BY LPAD(ID,7,'0') ASC
根据您的数据。
SELECT SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3)
return 100
所以,SELECT LPAD( SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3), 7, '0')
return 00000100
因此您可以组合字符串函数,例如SUBSTR
和LPAD
。现在有什么线索吗?
这是字母顺序,
你想要数字顺序,
为此,您必须在 ORDER BY 子句中
- trim成本"aaa-"部分
转换成数字
convert(SUBSTRING(val, 3), integer)
您可以提取数字部分,将其转换为数字数据类型,然后执行 ORDER BY
:
SELECT mytable.*,
CAST(SUBSTRING_INDEX(mycolumn, '-', - 1) AS UNSIGNED) mycolumnintdata
FROM
mytable
ORDER BY mycolumnintdata;
如果有不匹配数字的表达式,CAST
函数将return0
并首先显示那些记录。如果需要,您可以单独处理。
我遇到了类似的问题,我的诀窍就是这个
*"按长度排序(column_name), column_name
只要值的 non-numeric 部分长度相同,这将在 10 之前排序 1,在 100 之前排序 10,等等。"*
由Andreas Bergström on this question给出。
希望对某人有所帮助。
我有一个数据库,其中有一列包含以下数据:
aaa-1
aaa-2
aaa-3
...
aaa-10
aaa-11
...
aaa-100
aaa-101
...
aaa-1000
当我按升序查询和排序数据时,我得到:
aaa-1
aaa-10
aaa-11
...
aaa-100
aaa-101
...
aaa-1000
...
aaa-2
...
aaa-3
这实际上是正确的(机器)排序方式吗?订单是否因为 aaa-
前缀而被搞砸了?我该如何按照人类的方式对其进行排序(即看起来像第一个片段的东西)?
P.S。如果问题确实出在前缀上,是否有办法将其删除并仅使用数字部分进行排序?
P.P.S。有人向我建议我应该只更改我的数据并添加前导零,例如 aaa-0001
和 aaa-0002
等。但是,每次列表上升一个顺序时,我都不愿意采用这种方法的 10,我必须重新格式化此列。
提前谢谢大家! :)
我给你一个样本排序。不是基于您的数据样本,但这可以帮助您。
假设您有这样的数据:
id
----
1
2
6
10
13
当你做 ORDER BY id ASC
时会 return :
id
----
1
10
13
2
6
我建议,使用LPAD
。
此查询:SELECT LPAD('12',5,'0')
return 00012
所以当你有像我上面提供的 table 数据时,你可以像这样对它们进行排序:
SELECT * FROM TABLE
ORDER BY LPAD(ID,7,'0') ASC
根据您的数据。
SELECT SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3)
return 100
所以,SELECT LPAD( SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3), 7, '0')
return 00000100
因此您可以组合字符串函数,例如SUBSTR
和LPAD
。现在有什么线索吗?
这是字母顺序,
你想要数字顺序,
为此,您必须在 ORDER BY 子句中
- trim成本"aaa-"部分
转换成数字
convert(SUBSTRING(val, 3), integer)
您可以提取数字部分,将其转换为数字数据类型,然后执行 ORDER BY
:
SELECT mytable.*,
CAST(SUBSTRING_INDEX(mycolumn, '-', - 1) AS UNSIGNED) mycolumnintdata
FROM
mytable
ORDER BY mycolumnintdata;
如果有不匹配数字的表达式,CAST
函数将return0
并首先显示那些记录。如果需要,您可以单独处理。
我遇到了类似的问题,我的诀窍就是这个
*"按长度排序(column_name), column_name
只要值的 non-numeric 部分长度相同,这将在 10 之前排序 1,在 100 之前排序 10,等等。"*
由Andreas Bergström on this question给出。
希望对某人有所帮助。