2014-09-20 17 views
8
SELECT * 
FROM 
    TableName 
WHERE 
ORDER BY 
    CASE @OrderByColumn 
    WHEN 1 THEN Forename 
    WHEN 2 THEN Surname 
    END; 

Ho una dichiarazione come sopra che consente di scegliere dinamicamente come ordinare i risultati di una query. Tuttavia, come faccio a specificare che voglio il nome assegnato DESC e il cognome ASC?Descrizione caso per clausola Order Desc/Asc

+1

Si prega di consultare [questo post] (http://sqlperformance.com/2012/08/t-sql-queries/conditional-order-by) e [potrebbe essere anche una lettura interessante] (http: // blogs. sqlsentry.com/aaronbertrand/sql-variant-use-case/). –

risposta

12

È necessario dividere i ORDER BY in due parti:

SELECT * 
FROM 
    TableName 
WHERE 
ORDER BY 
    (CASE @OrderByColumn 
    WHEN 1 THEN Forename 
    END) DESC -- Forename --> descending 
, (CASE @OrderByColumn 
    WHEN 2 THEN Surname 
    END) ASC -- Surname --> ascending 
+0

votato grazie! –

+0

posso avere più di una colonna nel mio ordine per clausola? per esempio. 'CASE @OrderByColumn QUANDO 1 THEN Forename, Date END DESC' –

+0

@volumeone Non è così, no. Un'espressione 'CASE' restituisce un singolo valore, quindi è necessario ripetere il caso con una seconda colonna dopo una virgola. – dasblinkenlight

3

avete bisogno di due clausole nella order by:

ORDER BY (CASE WHEN @OrderByColumn = 1 and @Dir = 'ASC' THEN Forename 
       WHEN @OrderByColumn = 2 and @Dir = 'ASC' THEN Surname 
      END) ASC, 
     (CASE WHEN @OrderByColumn = 1 and @Dir = 'DESC' THEN Forename 
       WHEN @OrderByColumn = 2 and @Dir = 'DESC' THEN Surname 
      END) DESC 
Problemi correlati