我知道我可以按部分 sql 查询的顺序使用变量,如下所示:
order by
case when @var1 = 'priority' then priority end desc,
case when @var2 = 'report_date' then report_date end asc
但是我如何也为 asc 和 desc 部分使用变量呢?
我知道我可以按部分 sql 查询的顺序使用变量,如下所示:
order by
case when @var1 = 'priority' then priority end desc,
case when @var2 = 'report_date' then report_date end asc
但是我如何也为 asc 和 desc 部分使用变量呢?
如果没有Dynamic SQL
每个选项,它的子句例如:
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
假设您的变量@var3
存储'ASC'
或'DESC'
关键字,您可以编写如下内容:
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
您可以 通过在Order by
. 实现将取决于您是否能够将每个可排序字段转换为整数字段,如下所示:
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;
编辑
只是为了澄清一下,根据@t-clausen.dk
的观点,hack 取决于将 aa 转换回表示订单的递增数字类型。例如,如果您需要更高的 a 分辨率DATETIME
以确保在排序中也考虑时间分量,则INT @OrderHack
可以用 aFLOAT
或DECIMAL
等替换。警告:使用此技术对*CHAR
列进行排序可能具有挑战性,尤其是在区分大小写和重音的情况下考虑到。
试试这个——
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