2017-12-27 1406 views
1

我有字母數字數字。應用排序直通SQL服務器ORDER BY條款後,我得到以下結果使用SQL Server/C進行字母數字排序#

select * 
from WO 
where WOCode = AnyNumber 
order by [ColumnName] 

結果:

39660A1 
39660A10 
39660A11 
39660A2 
39660A3 
39660A4 
39660A5 
39660A6 
39660A7 
39660A8 
39660A9 

所需的結果

39660A1 
39660A2 
39660A3 
39660A4 
39660A5 
39660A6 
39660A7 
39660A8 
39660A9 
39660A10 
39660A11 
+1

通過'排序直通SQL server'你的意思是一個'ORDER BY'條款?你在找C#答案還是SQL答案?你有什麼嘗試?我們從哪裏開始? – Plutonix

+0

是的,我的意思是命令通過子句。 SQL或C#什麼都沒有問題 – SanamShaikh

+0

還有很少的事情要做 - 正在分類什麼?你會想要研究*自然排序* - 這裏有很多好的答案 – Plutonix

回答

2

這裏是一個快速和骯髒的解決方案:

SELECT * 
FROM table 
ORDER BY LEN(Field) ASC, Field ASC 

演示here

+0

完美的謝謝。 – SanamShaikh

1

假設字母A始終處於相同的位置,並且後面的字符是整數只有

然後,你可以這樣做:

WITH CTE AS 
(
    SELECT 
     WOCode, 
     CAST(SUBSTRING(WOCode, CHARINDEX('A', WOCode) + 1, 
         LEN(WOCode) - CHARINDEX('A', WOCode) + 1) AS INT) AS DisplayOrder 
    FROM 
     WO 
) 
SELECT * 
FROM CTE 
ORDER BY DisplayOrder; 

Demo

結果:

| WOCode | 
|----------| 
| 39660A1 | 
| 39660A2 | 
| 39660A3 | 
| 39660A4 | 
| 39660A5 | 
| 39660A6 | 
| 39660A7 | 
| 39660A8 | 
| 39660A9 | 
| 39660A10 | 
| 39660A11 | 

您還可以使用TRY_CAST,以避免可能的結果,因爲使用鑄鐵與非整數值的錯誤(感謝@ zambonee的建議):

WITH CTE AS 
(
    SELECT 
     WOCode, 
     CASE 
      WHEN TRY_CAST(WOCode AS INT) IS NULL 
       THEN CAST(SUBSTRING(WOCode, 
          CHARINDEX('A', WOCode) + 1, 
          LEN(WOCode) - CHARINDEX('A', WOCode) + 1) AS INT) 
       ELSE 0 
     END AS DisplayOrder 
    FROM 
     WO 
) 
SELECT * 
FROM CTE 
ORDER BY DisplayOrder; 

updated demo

相關問題