2017-12-27 13 views
1

英数字があります。 SQL Serverの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サーバーを介してソートする」とは、「ORDER BY」節を意味しますか?あなたはC#の答えやSQLの答えをお探しですか?何を試しましたか?どこから始めますか? – Plutonix

+0

はい私はOrder By By節を意味します。 SQLやC#の何かは問題ありません。 – SanamShaikh

+0

まだ何も進んでいません - 何がソートされていますか? * Natural Sort * - 多くの良い答えがここにあります – 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

関連する問題