2015-10-29 136 views
0

所以我在這裏看了幾個不同的例子,但是他們沒有一個似乎在爲我工作。SQL按字母順序排序

這裏是什麼,我需要排序的一個樣本:

Alpha #1 
Beta #3 
Charlie #2 
Alpha #2 
Charlie #1 
Beta #2 
Beta #1 
Alpha #10 

並排序,當我想

Alpha #1 
Alpha #2 
Alpha #10 
Beta #1 
Beta #2 
Beta #3 
Charlie #1 
Charlie #2 

然而,當我使用下面的查詢,Alpha #10不遵循所需的規則。

ORDER BY 
Case When IsNumeric(LEFT(MachineName,1)) = 1 
    Then CASE When IsNumeric(MachineName) = 1 
       Then Right(Replicate('0',20) + MachineName + '0', 20) 
       Else Right(Replicate('0',20) + MachineName, 20) 
      END 
    When IsNumeric(LEFT(MachineName,1)) = 0 
    Then Left(MachineName + Replicate('',21), 20) 
End 

我得到這個代替:

Alpha #1 
Alpha #10 
Alpha #2 
... 

我是新來LEFTRIGHT,所以我可能會做錯事,因此任何指導,將不勝感激!

回答

2
DECLARE @t TABLE(v VARCHAR(100)) 

INSERT INTO @t VALUES 
('Alpha #1'), 
('Beta #3'), 
('Charlie #2'), 
('Alpha #2'), 
('Charlie #1'), 
('Beta #2'), 
('Beta #1'), 
('Alpha #10'), 
('Alpha #') 

SELECT * FROM @t 
ORDER BY CASE WHEN PATINDEX('%[0-9]%', v) > 1 THEN SUBSTRING(v, 1, PATINDEX('%[0-9]%', v) - 1) END, 
     CASE WHEN PATINDEX('%[0-9]%', v) > 1 THEN CAST(SUBSTRING(v, PATINDEX('%[0-9]%', v), LEN(v)) AS INT) END 

輸出:

Alpha # 
Alpha #1 
Alpha #2 
Alpha #10 
Beta #1 
Beta #2 
Beta #3 
Charlie #1 
Charlie #2 
+0

是的,我相信這就是答案,但如果我有沒有一些行?例如,'Delta' 我收到錯誤:傳遞給左側或SUBSTRING函數的長度參數無效。我相信這是因爲某些條目中沒有數字而導致的 –

+0

@HardTacos,請參閱編輯 –

+0

謝謝!太棒了 –