自然排序SQL ORDER BY

时间:2013-06-27 22:22:24

标签: mysql sql sql-order-by

任何人都可以帮我把我应该添加到ORDER BY语句中的内容自然地对这些值进行排序:

1
10
2
22
20405-109
20405-101
20404-100
X
Z
D

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

1
2
10
22
20404-100
20405-101
20405-109
D
X
Z

我目前正在使用:

ORDER BY t.property, l.unit_number

其中值为l.unit_number

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

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

谢谢。

1 个答案:

答案 0 :(得分:7)

这样做:

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

the ORDER BY的4个等级:

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