Quelle est la syntaxe MS SQL correcte pour sélectionner plusieurs colonnes ORDER BY lorsque ORDER BY est basé sur une instruction CASE?
Le ci-dessous fonctionne bien avec des colonnes simples, mais j'ai besoin de sortinger par plusieurs colonnes:
SELECT * FROM Products ORDER BY CASE WHEN @SortIndex = 1 THEN Price END ASC, CASE WHEN @SortIndex = 2 THEN Price DESC, Title ASC END <-- problem line
Tu pourrais essayer ça
SELECT * FROM Products ORDER BY CASE WHEN @SortIndex = 1 THEN Price END ASC, CASE WHEN @SortIndex = 2 THEN Price END DESC, CASE WHEN @SortIndex = 2 THEN Title END ASC
@ Brad. Pavel proposait ce qui suit (je pense),
DECLARE @query VARCHAR(MAX) SET @query = 'SELECT * FROM Products ORDER BY ' IF (@SortIndex = 1) SET @query =@query + ' Price ASC ' ELSE IF (@SortIndex = 2) SET @query =@query + ' Price DESC, Title ASC ' sp_executesql @query
Pourquoi pensez-vous que SQL dynamic n'est pas adapté aux procédures stockées complexes? Ce sont exactement les endroits où vous devriez utiliser le SQL dynamic car cela peut aider à réduire la complexité et à résoudre des problèmes tels que le reniflage de parameters. Je suis d'accord que SQL dynamic a ses inconvénients, mais je vous recommand au less d'essayer si cela fonctionne pour vous.
Essayez ceci comme un impact inférieur sur les performances du server – en supposant que vous avez seulement 2 valeurs à @SortIndex (1 et 2). Si non, prolongez votre If avec plus de conditions.
If @SortIndex = 1 BEGIN SELECT * FROM Products ORDER BY Price ASC END ELSE BEGIN SELECT * FROM Products ORDER BY Price DESC, TITLE ASC END
Faites ceci … et dites adieu à votre performance. Malheureusement, la meilleure solution consiste à utiliser SQL dynamic.
Vous pourriez réécrire ceci:
ORDER BY CASE WHEN @SortIndex = 1 THEN Price END ASC, CASE WHEN @SortIndex = 2 THEN Price DESC, Title ASC END
comme
CASE WHEN @SortIndex = 1 THEN Price END ASC, CASE WHEN @SortIndex = 2 THEN Price DESC END, Title ASC
Cela ajoute la colonne de sorting ajoutée à tous les cas, mais dans ma situation, c'est ce que je voulais.
Vous pouvez aussi le faire (juste par exemple):
CASE WHEN @SortIndex = 1 THEN Price END ASC,Title ASC, CASE WHEN @SortIndex = 2 THEN Price DESC END