2009-04-17 9 views
25

Je veux faire pour rendre la commande dans ma requête conditionnelle si elle satisfiess l'état où il doit être commandé en descendantMS Sql: sous condition ORDER BY ASC/DESC Question

Par exemple:

SELECT * FROM Data ORDER BY SortOrder CASE WHEN @Direction = 1 THEN DESC END 

Répondre

36

ne changez pas la ASC ou DESC, changer le signe de la chose étant triée par:

SELECT * FROM table 
ORDER BY 
CASE WHEN @Direction = 1 THEN -id else id END asc; 

L'OP demande:

Les gars, je ne suis pas l'expert SQL, s'il vous plaît me expliquer ce que signifie l'identité et -id, est-elle contrôle la direction de commande?

id est la colonne que vous triez; -id est juste la négation de cela, id * -1. Si vous triez par plus d'une colonne, vous devrez annuler chaque colonne:

SELECT * FROM table 
ORDER BY 
CASE WHEN @Direction = 1 THEN -id else id END 
CASE WHEN @Direction = 1 THEN -othercolumn else othercolumn END ; 

Si vous commandez par une colonne non numérique, vous aurez besoin de trouver une expression qui fait cette colonne "négatif"; écrire une fonction pour le faire peut aider.

+0

Les gars, je ne suis pas l'expert SQL, s'il vous plaît expliquez-moi ce que signifie l'ID et -id, contrôle-t-il le sens de la commande? – Shimmy

+0

En outre, j'ai modifié ma requête, veuillez la consulter. – Shimmy

+0

Donc je n'ai pas besoin d'écrire ASC, n'est-ce pas? – Shimmy

1

je l'ai fait quelque chose comme ça

select productId, InventoryCount, 
    case 
    when @Direction = 1 then InventoryCount 
    else -InventoryCount 
    end as "SortOrder" 
order by 3 
+0

Je ne comprends pas ce que vous avez écrit, de toute façon, je modifié ma requête dans la question s'il vous plaît examiner la requête . – Shimmy

+0

Ma réponse est essentiellement la même que la réponse acceptée, sauf que c'est mieux, ayant la logique entièrement dans la clause ORDER BY, où j'ai inclus une colonne fictive et ordonnée sur cela. – MikeW

9
SELECT * 
FROM Data 
ORDER BY 
Case WHEN @Direction = 1 THEN SortOrder END DESC, 
Case WHEN 1=1 THEN SortOrder END 
7

Vous pouvez également utiliser un système qui prend en charge tous les types de colonnes:

SELECT <column_list> FROM <table> ORDER BY CASE WHEN @sort_order = 'ASC' AND @sort_column = '<column>' THEN <column> END ASC, CASE WHEN @sort_order = 'DESC' AND @sort_column = '<column>' THEN <column> END DESC

+0

cela semble fonctionner mais je ne comprends pas comment le 'asc'/'desc' après la 'fin' est invoqué? – mulllhausen

+1

@mulllhausen Ils sont "invoqués" par défaut, juste que dans le cas où l'instruction case est fausse, elle retournera NULL pour toutes les lignes, éliminant ainsi l'effet du tri. – Tsaukpaetra