ejemplos - sql order by date
Usando variables para asc y desc en orden por (4)
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
Esta pregunta ya tiene una respuesta aquí:
Entiendo que puedo usar variables en el orden por sección de consultas de 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 uso las variables para las secciones asc y desc también?
Puede ordenar dinámicamente en muchos tipos introduciendo un truco multiplicador en la Order by
. La implementación dependerá de que seas capaz de convertir cada campo clasificable en 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 la conversión a un tipo numérico creciente que represente la orden. por ejemplo, si necesita una resolución más alta en un DATETIME
para asegurarse de que el componente de tiempo también se considere en la clasificación, el INT @OrderHack
puede reemplazarse por un FLOAT
o DECIMAL
etc. , especialmente si se tiene en cuenta la sensibilidad de acento y acento.
Suponiendo que su variable @var3
almacene ''ASC''
palabras clave ''ASC''
o ''DESC''
, puede 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
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