Usando variables para asc y desc en orden por [duplicate]


Esta pregunta ya tiene una respuesta aquí:

Entiendo que puedo usar variables en la sección order by de las consultas sql como esta:

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

Pero ¿cómo utilizo variables para las secciones asc y desc también?

Author: oshirowanen, 2013-08-13

4 answers

Sin Dynamic SQL cada opción es la cláusula por ejemplo:

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
 36
Author: Luis LL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-13 11:40:41

Asumiendo que tu variable @var3 almacena 'ASC' o 'DESC' palabras clave, puedes escribir algo como esto:

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
Author: Nenad Zivkovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-13 11:42:08

Puede ordenar dinámicamente en muchos tipos introduciendo un hack multiplicador al Order by. La implementación dependerá de que usted sea capaz de convertir cada campo clasificable a un campo entero, así:

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 here

Editar

Solo para aclarar, según el punto de @t-clausen.dk, el hackeo depende de una conversión a un tipo numérico creciente que representa el orden. por ejemplo, si necesita una resolución más alta en un DATETIME para garantizar que el componente de tiempo también se considera en la ordenación, el INT @OrderHack puede ser reemplazado por un FLOAT o DECIMAL etc. Advertencia: Usar esta técnica para ordenar las columnas *CHAR podría ser un desafío, especialmente si se tiene en cuenta la sensibilidad de mayúsculas y minúsculas.

 7
Author: StuartLC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:35

Prueba este-

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
Author: Devart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-13 11:40:36