Ordre SQL conditionnel par ASC / DESC pour les colonnes alpha

écrire une procédure stockée dans MS SQL Server 2008 R2, je veux éviter D'utiliser DSQL...

je voudrais que la méthode de tri (ASC ou DESC) soit conditionnelle.

maintenant, avec une colonne numérique, j'utiliserais simplement une instruction case et annulerais la valeur pour émuler ASC ou DESC... C'est-à-dire:

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

Quelle est la méthode appropriée pour ce faire avec une colonne alpha?

EDIT: j'ai pensé à un intelligent mais ça semble terriblement inefficace... Je pourrais insérer ma colonne alpha ordonnée dans une table de température avec un numéroautonomètre puis Trier par le numéroautonomètre en utilisant la méthode décrite ci-dessus.

EDIT2:

Que pensez-vous de cette approche?

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

Je ne sais pas si forcer une sorte sur une colonne uniforme est plus efficace que de tirer des nombres de chaînes triées

13
demandé sur Martijn Pieters 2010-10-07 22:54:00

2 réponses

Une option

;WITH cQuery AS
(
   SELECT
       *,
       ROW_NUMBER() OVER (ORDER BY SortColumn) AS RowNum
   FROM
       MyTable
)
SELECT
   *
FROM
   cQuery
ORDER BY
   RowNum * @Direction --1 = ASC or -1 = DESC

Ou de CAS qui à mon humble avis est un peu plus laide

ORDER BY
  CASE WHEN 'ASC' THEN SortColumn ELSE '' END ASC,
  CASE WHEN 'DESC' THEN SortColumn ELSE '' END DESC
29
répondu gbn 2010-10-08 04:47:20

C'est l'un de ces cas où des solutions spécifiques peuvent être préférables à des solutions génériques, en particulier lorsque nous traitons de grandes quantités de données. Je voudrais:

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

si vous avez un index sur [AlphaColumn], vous pourriez parfois obtenir un meilleur plan avec une requête plus spécifique, qu'avec un générique Taille unique.

Edit: pour faciliter la réutilisation du code, vous pouvez envelopper votre select dans un UDF en ligne - il fonctionnera tout aussi bien:

IF @OrderAscOrDesc = 0 THEN BEGIN
  SELECT ...
  FROM  YourInlineUdf(...)
  ORDER BY [AlphaColumn] ASC
END ELSE BEGIN
  SELECT ...
  FROM  YourInlineUdf(...) 
  ORDER BY [AlphaColumn] DESC
END
1
répondu A-K 2010-10-07 21:22:46