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?
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
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
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;
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.
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
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