【问题标题】:How to natural sort “X-Y” string data, first by X and then by Y?如何对“X-Y”字符串数据进行自然排序,首先按 X,然后按 Y?
【发布时间】:2020-10-29 00:06:37
【问题描述】:

鉴于此数据:

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

【问题讨论】:

  • 你想得到什么结果?
  • 我认为您想使用RPAD 而不是LPAD
  • 前缀(连字符前)是否总是三个字符?
  • W55-66和W55-7应该如何排序?破折号的右边是否被排序为整数?也就是说,是排序 7 显示的左划线数据不会有这个潜在问题 iff 它具有固定宽度,例如 YY 到 2099..

标签: mysql sql natural-sort


【解决方案1】:

假设-两侧的部分分别限制为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

Demo on db-fiddle

如果值可以分别超过2位或5位,只需将第二个参数更改为LPAD即可。

【讨论】:

  • 非常感谢!
  • @ChrisKohout 不用担心 - 我很高兴能提供帮助。
【解决方案2】:

我会这样做:

order by substring_index(col, '-', 1) desc,
         substring_index(col, '-', -1) + 0 desc

这按连字符之前的部分作为字符串排序。并将连字符后面的部分转换为数字以进行排序。

【讨论】:

  • 如果- 之前可能有一个数字,这可能会乱序,例如W4 将排序高于 W20 而不是更低。
猜你喜欢
  • 2011-02-17
  • 2021-08-04
  • 1970-01-01
  • 2011-08-22
  • 2010-09-22
  • 2023-03-25
  • 2011-02-14
  • 2014-01-10
相关资源
最近更新 更多