19 Stimmen

Bedingte SQL ORDER BY ASC/DESC für alphabetische Spalten

Beim Schreiben einer gespeicherten Prozedur in MS SQL Server 2008 R2 möchte ich vermeiden, DSQL zu verwenden...

Ich möchte, dass die Sortiermethode (ASC oder DESC) bedingt ist.

Jetzt würde ich bei einer numerischen Spalte einfach eine Fallanweisung verwenden und den Wert negieren, um ASC oder DESC zu emulieren... Das heißt:

... ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [NumericColumn] ELSE -[NumericColumn] END ASC

Was ist eine geeignete Methode, um dies mit einer alphanumerischen Spalte zu tun?

EDIT: Ich habe an einen cleveren Weg gedacht, aber es scheint furchtbar ineffizient zu sein... Ich könnte meine sortierte alphanumerische Spalte in eine Temp-Tabelle mit einer automatischen Nummer einfügen und nach der automatischen Nummer unter Verwendung der oben beschriebenen Methode sortieren.

EDIT2:

Was haltet ihr von diesem Ansatz?

ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [AlphaColumn] ELSE '' END ASC,
CASE @OrderAscOrDesc WHEN 0 THEN '' ELSE [AlphaColumn] END DESC

Ich weiß nicht, ob es effizienter ist, eine Sortierung auf einer einheitlichen Spalte zu erzwingen oder Zahlen aus sortierten Zeichenfolgen abzuleiten

42voto

gbn Punkte 407102

Eine Option

;MIT cQuery ALS
(
   AUSWÄHLEN
       *,
       ROW_NUMBER() OVER (ORDER BY SortColumn) AS RowNum
   VON
       MyTable
)
AUSWÄHLEN
   *
VON
   cQuery
ORDER VON
   RowNum * @Direction --1 = ASC oder -1 = DESC

Oder CASE, das meiner Meinung nach ein bisschen hässlicher ist

ORDER VON
  FALLS 'ASC' DANN SortColumn SONST '' ENDE ASC,
  FALLS 'DESC' DANN SortColumn SONST '' ENDE DESC

1voto

A-K Punkte 16460

Dies ist einer dieser Fälle, in denen spezifische Lösungen möglicherweise bevorzugt werden, insbesondere wenn wir es mit großen Datenmengen zu tun haben. Ich würde:

IF @OrderAscOrDesc = 0 THEN BEGIN
  SELECT ...
  FROM  ... 
  ORDER BY [AlphaColumn] ASC
END ELSE BEGIN
  SELECT ...
  FROM  ... 
  ORDER BY [AlphaColumn] DESC
END

Wenn Sie einen Index auf [AlphaColumn] haben, erhalten Sie manchmal einen besseren Plan mit einer spezifischeren Abfrage als mit einer generischen "one-size-fits-all" Abfrage.

Bearbeitung: Um die Code-Wiederverwendung zu erleichtern, können Sie Ihr Select in eine Inline-UDF einwickeln - es wird genauso gut performen:

IF @OrderAscOrDesc = 0 THEN BEGIN
  SELECT ...
  FROM  YourInlineUdf(...)
  ORDER BY [AlphaColumn] ASC
END ELSE BEGIN
  SELECT ...
  FROM  YourInlineUdf(...) 
  ORDER BY [AlphaColumn] DESC
END

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X