如何对“X-Y”字符串数据进行自然排序,先按 X 再按 Y?
How to natural sort “X-Y” string data, first by X and then by Y?
鉴于此数据:
W18-40461
W19-1040
W20-4617
W20-100
我已经尝试了几种常见的mysql自然排序方法,但它们不会以自然降序方式对这些方法进行排序,例如:
W20-4617
W20-100
W19-1040
W18-40461
例如:
select theID
from Table
where theID
order by lpad(theID, 9, 0) desc
假设-
两边的部分分别限制为2位和5位,则可以使用SUBSTR
(和LOCATE
来提取两个数值来找到-
两个数字之间),然后 LPAD
将每个值填充到 2 位和 5 位数字,以便按数字对它们进行排序:
SELECT *
FROM data
ORDER BY LPAD(SUBSTR(id, 2, LOCATE('-', id) - 2), 2, '0') DESC,
LPAD(SUBSTR(id, LOCATE('-', id) + 1), 5, '0') DESC
输出(对于我的扩展样本):
id
W20-12457
W20-4617
W20-100
W19-1040
W18-40461
W4-2017
如果值可以分别超过2位或5位,只需将第二个参数更改为LPAD
即可。
我会这样做:
order by substring_index(col, '-', 1) desc,
substring_index(col, '-', -1) + 0 desc
这按连字符前的部分作为字符串排序。并将连字符后的部分转换为数字以进行排序。
鉴于此数据:
W18-40461
W19-1040
W20-4617
W20-100
我已经尝试了几种常见的mysql自然排序方法,但它们不会以自然降序方式对这些方法进行排序,例如:
W20-4617
W20-100
W19-1040
W18-40461
例如:
select theID
from Table
where theID
order by lpad(theID, 9, 0) desc
假设-
两边的部分分别限制为2位和5位,则可以使用SUBSTR
(和LOCATE
来提取两个数值来找到-
两个数字之间),然后 LPAD
将每个值填充到 2 位和 5 位数字,以便按数字对它们进行排序:
SELECT *
FROM data
ORDER BY LPAD(SUBSTR(id, 2, LOCATE('-', id) - 2), 2, '0') DESC,
LPAD(SUBSTR(id, LOCATE('-', id) + 1), 5, '0') DESC
输出(对于我的扩展样本):
id
W20-12457
W20-4617
W20-100
W19-1040
W18-40461
W4-2017
如果值可以分别超过2位或5位,只需将第二个参数更改为LPAD
即可。
我会这样做:
order by substring_index(col, '-', 1) desc,
substring_index(col, '-', -1) + 0 desc
这按连字符前的部分作为字符串排序。并将连字符后的部分转换为数字以进行排序。