自然排序SQL ORDER BY

tr3*_*ine 3 mysql sql sql-order-by

任何人都可以借给我一个关于我应该附加到我的ORDER BY语句以自然地对这些值进行排序的方法:

1
10
2
22
20405-109
20405-101
20404-100
X
Z
D
Run Code Online (Sandbox Code Playgroud)

理想情况下,我喜欢以下内容:

1
2
10
22
20404-100
20405-101
20405-109
D
X
Z
Run Code Online (Sandbox Code Playgroud)

我目前正在使用:

ORDER BY t.property, l.unit_number
Run Code Online (Sandbox Code Playgroud)

价值在哪里 l.unit_number

我已经尝试过l.unit_number * 1,l.unit_number + 0但他们没有工作.

我应该做一些ORDER有条件的,比如Case When IsNumeric(l.unit_number)

谢谢.

Har*_* CO 7

这样做:

SELECT value
FROM Table1
ORDER BY value REGEXP '^[A-Za-z]+$'
        ,CAST(value as SIGNED INTEGER)
        ,CAST(REPLACE(value,'-','')AS SIGNED INTEGER)
        ,value
Run Code Online (Sandbox Code Playgroud)

4个级别the ORDER BY:

  1. REGEXP 指定任何alpha线a 1和非alphas a 0
  2. SIGNED INT 按破折号前面的部分对所有数字进行排序.
  3. SIGNED INT删除短划线后,在短划线之前按短划线之后的部分对具有相同值的任何项目进行排序.可能会取代2号,但如果出现这种情况,则不希望90-1与9-01相同.
  4. 按字母顺序对字母进行排序.

演示:SQL小提琴