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