2017-12-27 4 views
1

Ich habe alphanumerische Zahlen. Nach der Anwendung ORDER BY Klausel Sortierung durch SQL Server, erhalte ich Ergebnis folgendeAlphanumerische Sortierung mit SQL Server/C#

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

Ergebnis:

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

Erforderliche Ergebnis

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

von 'durch SQL server' Sortierung meinen Sie eine' ORDER BY' Klausel? Suchen Sie eine C# -Antwort oder eine SQL-Antwort? Was hast du probiert? Wo fangen wir an? – Plutonix

+0

ja ich meine Reihenfolge nach Klausel. SQL oder C# alles ist in Ordnung – SanamShaikh

+0

Es gibt immer noch sehr wenig zu tun - was wird sortiert? Sie werden nach * Natural Sort * suchen müssen - viele gute Antworten hier – Plutonix

Antwort

2

Hier ist eine schnelle und schmutzige Lösung:

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

Demo here.

+0

perfekt danke. – SanamShaikh

1

Angenommen, der Buchstabe A ist immer an der gleichen Position und die Zeichen danach sind ganze Zahlen nur.

Dann können Sie dies tun:

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

Ergebnisse:

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

Sie auch TRY_CAST Fehler zu vermeiden, verwenden können, die wegen der Verwendung von Guss mit nicht ganzzahligen Werten führen könnte (Danke an @zambonee für den Vorschlag):

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

Verwandte Themen