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
  • ...
War es hilfreich?

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:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top