2013-06-27 112 views
2

誰能借我一隻手爲我應該追加什麼我的ORDER BY語句,這些值自然排序:自然排序SQL 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

你怎麼能指望'20405-109'和'X'被處理? – Aiias

+0

我添加了所需的輸出。道歉。知道我忘了一些東西。 – tr3online

+0

20405-109可以被劃分並在Alpha之前或之後出現。這非常寬鬆。我只想讓事情正確排序。 1-> 2-> 3-> 10-> 11-> 20-> 21,A-> B-> C-> D等 – tr3online

回答

7

這就能做到:

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

的4個級別的the ORDER BY

  1. REGEXP分配任何α線1和非阿爾法0
  2. SIGNED INT排序所有的號碼的由破折號前的部分組成。
  3. SIGNED INT刪除短劃線之後,對短劃線之後的部分使用相同值的任何項目進行排序。可能可以取代2號,但如果出現這種情況,則不希望90-1與9-01相同。
  4. 按字母順序排列字母。

演示:SQL Fiddle

+0

哇,這個效果非常好。謝謝!我從來沒有做過複雜的ORDER BY,這會給我一些想法 – tr3online