2010-07-01 19 views
7

Ich habe eine Spalte, die in der Regel nur Zahlen ist (manchmal sind es Buchstaben, aber das ist nicht wichtig).Natürliche Sortierung für SQL Server?

Wie kann ich es natürliche Sortierung machen?

sortiert Zeit wie folgt: {} 1,10,11,12,2,3,4,5,6,7,8,9

ich es wie folgt sortiert werden soll: {1,2 3,4,5,6,7,8,9,10,11,12,}

Antwort

6

IsNumeric ist "kaputt", ISNUMERIC (CHAR (13)) gibt 1 zurück und CAST schlägt fehl.

Verwenden Sie ISNUMERIC (Textval + 'e0'). Schlusscode:

ORDER BY 
    PropertyName, 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN 0 ELSE 1 END, -- letters after numbers 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN CAST(MixedField AS INT) ELSE 0 END, 
    MixedField 

Sie können Auftragsparameter mischen ...

+0

Fast da, das sortiert nicht-numerisch es fügt sie einfach willy-nilly bis zum Ende hinzu. Ich ändere Ihre Anfrage und akzeptiere sie – Malfist

-3

Haben Sie mit gebunden:

'OrderBy Column Asc'

am Ende der Anfrage.

+8

Das ist keine natürliche Art, das ist eine ASCII-Art. – Malfist

1

Werfen Sie es. Vergessen Sie auch nicht, IsNumeric zu verwenden, um sicherzustellen, dass Sie nur die Zahlen zurückbekommen (wenn sie Buchstaben enthalten, ist es wichtig;).

Auch auf den Datentyp umwandeln, der den größten Wert enthält.

Wenn Sie auch die Nicht-Nummern in der Ergebnismenge benötigen, fügen Sie einfach eine UNION-Abfrage an, in der IsNumeric = 0 (Reihenfolge nach Wunsch) entweder vor oder nach.

+0

Das Problem mit der Union ist, dass diese Art nicht die erste Ebene ist. Die erste Sortierung erfolgt nach Eigenschaftsnamen, und diese Sortierung erfolgt nach Einheitsnummer (normalerweise numerisch, könnte aber auch A, B, C, ... lauten). Unioning würde viel abwerfen – Malfist

Verwandte Themen