Sortier nvarchar Spalte als integer
-
02-07-2019 - |
Frage
Ich habe Daten gemischt i nvarchar Spalte (Wörter und Zahlen). Welche ist schnellster Weg, um Daten in dieser Spalte in numerischer Reihenfolge zu sortieren.
Ergebnis Beispiel:
- 1
- 2
- 3
- ...
- 10
- 11
- ...
- AAAA
- aaab
- b
- ba
- ba
- ...
Lösung
verwenden:
ORDER BY
CASE WHEN ISNUMERIC(column) = 1 THEN 0 ELSE 1 END,
CASE WHEN ISNUMERIC(column) = 1 THEN CAST(column AS INT) ELSE 0 END,
column
Das funktioniert wie erwartet.
Hinweis : Sie sagen, schnellster Weg . Diese SQL war schnell für mich zu produzieren, aber der Ausführungsplan zeigt eine Tabelle-Scan, gefolgt von einem skalare Berechnung. Dies könnte möglicherweise ein temporäres Ergebnis produzieren alle Werte dieser Spalte mit einigen zusätzlichen temporären Spalten für die ISNUMERIC Ergebnisse enthält. Es ist vielleicht nicht schnell auszuführen.
Andere Tipps
Wenn Sie Pad links Ihre Zahlen mit 0'en und Art auf, dass, werden Sie Ihre gewünschten Ergebnisse. Sie werden sicherstellen müssen, dass die Anzahl von 0 Sie Pad mit Streichhölzern der Größe der Varchar-Spalte.
Werfen Sie einen Blick auf dieses Beispiel ...
Declare @Temp Table(Data VarChar(20))
Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('11')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('aaab')
Insert Into @Temp Values('b')
Insert Into @Temp Values('ba')
Insert Into @Temp Values('ba')
Select * From @Temp
Order By Case When IsNumeric(Data) = 1
Then Right('0000000000000000000' + Data, 20)
Else Data End
Beachten Sie auch, dass es wichtig ist, wenn ein Fall-Anweisung, dass jeder Zweig der Case-Anweisung den gleichen Datentyp zurückgibt, sonst werden Sie falsche Ergebnisse oder einen Fehler.
- Check für existance
falls vorhanden (select * from dbo.sysobjects wobei [id] = object_id (N'dbo.t ') und Object (id, N'IsUserTable') = 1)
drop table dbo.t
gehen
- Beispieltabelle
erstellen
Tabelle dbo.t (c varchar (10) nicht null) erstellen
set nocount auf
- Beispieltabelle
bevöl
Einfügen in dbo.t (c) VALUES ( '1')
Einfügen in dbo.t (c) VALUES ( '2')
Einfügen in dbo.t (c) VALUES ( '3')
Einfügen in dbo.t (c) Werte ('10 ‚)
Einfügen in dbo.t (c) VALUES ( '11')
Einfügen in dbo.t (c) VALUES ( 'AAAA')
Einfügen in dbo.t (c) VALUES ( 'aaab')
Einfügen in dbo.t (c) VALUES ( 'b')
Einfügen in dbo.t (c) VALUES ( 'ba')
insert into dbo.t (c) Werte ( 'ba')
- gibt die Daten
wählen c von dbo.t
Um nach Fall, wenn IsNumeric (c) 1 dann 0, sonst 1 end =,
Fall, wenn IsNumeric (c) = 1 dann (wie int c) gegossen sonst 0 Ende,
c
Sie können die Daten entweder als alphanumerische behandeln oder numerisch, nicht beide gleichzeitig. Ich glaube nicht, was Sie versuchen, möglich zu tun ist, ist das Datenmodell nicht richtig eingerichtet.
Das glaube ich nicht, was Sie versuchen zu tun ist möglich
Dieses Beispiel funktioniert
SELECT * FROM TableName
ORDER BY CASE WHEN 1 = IsNumeric(ColumnName) THEN Cast(ColumnName AS INT) END
Das Ergebnis ist:
- a
- b
- c
- ...
- 1
- 2
- 3
Aber ich brauche Zahlen zuerst.
Dies sollte funktionieren:
select * from Table order by ascii(Column)
Wirf ihn.
SELECT * FROM foo ORDER BY CAST(somecolumn AS int);
Sie sind bereits eine Weile her, seit ich SQL Server berührt habe, so könnte meine Syntax allerdings völlig falsch sein:)