web-dev-qa-db-fra.com

Utilisation des variables pour asc et desc dans l'ordre par

Je comprends que je peux utiliser des variables dans l'ordre par section des requêtes SQL comme ceci:

order by 
case when @var1 = 'priority' then priority end desc,
case when @var2 = 'report_date' then report_date end asc

Mais comment utiliser également les variables pour les sections asc et desc?

27
oshirowanen

sans pour autant Dynamic SQL chaque option est sa clause par exemple:

ORDER BY
  case when @var1 = 'priority asc' THEN priority END ASC ,
  case when @var1 = 'priority desc' then priority end DESC,
  case when @var2 = 'report_date asc' then report_date end ASC,
  case when @var2 = 'report_date desc' then report_date end DESC
41
Luis LL

Vous pouvez trier dynamiquement sur de nombreux types en introduisant un hack multiplicateur dans le Order by. L'implémentation dépendra de votre capacité à convertir chaque champ triable en un champ entier, comme ceci:

DECLARE @Var1 NVARCHAR(20);
DECLARE @Var2 NVARCHAR(3);
DECLARE @OrderHack INT;

SET @Var1 = 'priority';
SET @Var2 = 'DESC';

IF (@Var2 = 'ASC')
    SET @OrderHack = 1;
ELSE
    SET @OrderHack = -1;

SELECT * 
    FROM SortTable
    ORDER BY 
        CASE @var1
            WHEN 'priority'
                THEN CONVERT(INT, [priority]) * @OrderHack
            WHEN 'report_date'
                THEN CONVERT(INT, report_date) * @OrderHack
        END;

SqlFiddle ici

Modifier

Juste pour clarifier, selon le point de @t-clausen.dk, Le hack dépend d'une conversion en un type numérique croissant représentant l'ordre. par exemple. si vous avez besoin d'une résolution plus élevée sur un DATETIME pour vous assurer que le composant temps est également pris en compte dans le tri, le INT @OrderHack peut être remplacé par un FLOAT ou DECIMAL etc. Avertissement: L'utilisation de cette technique pour trier les colonnes *CHAR pourrait être difficile, surtout si la sensibilité à la casse et à l'accent est prise en compte.

7
StuartLC

En supposant que votre variable @var3 magasins 'ASC' ou 'DESC' mots-clés, vous pouvez écrire quelque chose comme ceci:

order by 
case when @var1 = 'priority' and @var3 = 'DESC' then priority end DESC,
case when @var1 = 'priority' and @var3 = 'ASC' then priority  end ASC,
case when @var2 = 'report_date' and @var3 = 'ASC' then report_date end ASC,
case when @var2 = 'report_date' and @var3 = 'DESC' then report_date end DESC
7
Nenad Zivkovic

Essaye celui-là -

DECLARE 
      @column VARCHAR(15) = 'object_id'
    , @order CHAR(4) = 'DESC'

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
SELECT * 
FROM sys.objects 
ORDER BY ' + @column + ' ' + @order

PRINT @SQL
EXEC sys.sp_executesql @SQL
5
Devart