2009-04-17 19 views
25

Quiero hacer para hacer el pedido en mi consulta condicional por lo que si satisfiess la condición que debe ser ordenada por descendiendoMS SQL: ORDEN condicional POR ASC/DESC Pregunta

Por ejemplo:

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

Respuesta

36

no cambie el ASC o DESC, cambiar el signo de la cosa se está clasificando por:

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

El PO pregunta:

Chicos, yo no soy el experto SQL, por favor me explique lo que significa la identificación y -id, hace que controla la dirección de pedido?

id es cualquier columna que esté ordenando; -id es solo la negación de eso, id * -1. Si va a la clasificación por más de una columna, tendrá que negar cada columna:

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

Si usted está ordenando por una columna no numérica, se tendrá que encontrar una expresión que hace que la columna "negativo"; escribir una función para hacer eso puede ayudar.

+0

Chicos, no soy el experto SQL, por favor, explíquenme qué significa el ID y -id, ¿controla la dirección del pedido? – Shimmy

+0

Además, he editado mi consulta, revísela. – Shimmy

+0

Entonces realmente no tengo que escribir ASC, ¿verdad? – Shimmy

1

he hecho algo como esto

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

No entiendo lo que ha escrito, de todos modos, he editado mi consulta en la cuestión por favor revise la consulta . – Shimmy

+0

Mi respuesta es esencialmente la misma que la aceptada, excepto que es mejor, teniendo toda la lógica en la cláusula ORDER BY, donde he incluido una columna ficticia y he ordenado eso. – MikeW

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

También puede utilizar un esquema que soporta todos los tipos de columna:

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

esto parece funcionar, pero no entiendo cómo se invoca el 'asc'/'desc' después del 'end'? – mulllhausen

+1

@mulllhausen Obtienen "invocado" por defecto, solo que en el caso de que el enunciado de caso sea falso, devolverá NULO para todas las filas, eliminando así el efecto del género. – Tsaukpaetra