我有一个包含以下数据的列的数据库:
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个,我必须重新格式化此列。
提前谢谢大家! :)
答案 0 :(得分:2)
您可以提取数字部分,将其转换为数字数据类型,然后执行ORDER BY
:
SELECT mytable.*,
CAST(SUBSTRING_INDEX(mycolumn, '-', - 1) AS UNSIGNED) mycolumnintdata
FROM
mytable
ORDER BY mycolumnintdata;
如果存在与数字不匹配的表达式,CAST
函数将返回0
,并且将首先显示这些记录。如果需要,您可以单独处理。
答案 1 :(得分:1)
我有一个类似的问题,为我做的伎俩是这个
*" ORDER BY LENGTH(column_name),column_name
只要值的非数字部分长度相同,这将在10之前排序1,在100之前排序10等等。" *
Andreas Bergström在this question上提供的。
希望有人帮助。
答案 2 :(得分:0)
我会给你一个样本排序。不是基于您的数据样本,但这可以帮助您。
假设你有这样的数据:
id
----
1
2
6
10
13
当您ORDER BY id ASC
返回时:
id
----
1
10
13
2
6
我建议使用LPAD
。
此查询:SELECT LPAD('12',5,'0')
返回00012
因此,当您拥有我上面提供的表数据时,您可以按照以下方式对它们进行排序:
SELECT * FROM TABLE
ORDER BY LPAD(ID,7,'0') ASC
根据您的数据。
SELECT SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3)
返回100
因此,SELECT LPAD( SUBSTR('aaa-100',5,LENGTH('aaa-100') - 3), 7, '0')
返回00000100
因此,您可以组合字符串函数,例如SUBSTR
和LPAD
。现在有任何线索吗?
答案 3 :(得分:0)
这是字母顺序,
你想要数字顺序,
要做到这一点,你必须在ORDER BY子句
将其转换为数字
转换(SUBSTRING(val,3),整数)