Sql 按顺序使用asc和desc的变量

Sql 按顺序使用asc和desc的变量,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我知道我可以按sql查询的顺序使用变量,如下所示: order by case when @var1 = 'priority' then priority end desc, case when @var2 = 'report_date' then report_date end asc 但是我如何为asc和desc部分使用变量呢?试试这个- DECLARE @column VARCHAR(15) = 'object_id' , @order CHAR(4) = 'DE

我知道我可以按sql查询的顺序使用变量,如下所示:

order by 
case when @var1 = 'priority' then priority end desc,
case when @var2 = 'report_date' then report_date end asc
但是我如何为asc和desc部分使用变量呢?

试试这个-

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

没有
动态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

通过在的排序依据中引入一个,可以对多种类型进行动态排序。实现将取决于您能否将每个可排序字段转换为整数字段,如下所示:

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
的观点,黑客依赖于转换回表示顺序的递增数字类型。e、 g.如果您需要对
DATETIME
进行更高的分辨率,以确保在排序时也考虑到时间成分,则可以将
INT@OrderHack
替换为
FLOAT
DECIMAL
等。注意:使用此技术对
*CHAR
列进行排序可能具有挑战性,特别是在考虑了区分大小写和重音的情况下。

您愿意使用动态SQL吗?如果不是,那么唯一的方法就是在order by中有4个case,一个用于列,一个用于顺序。注意OP的排序列似乎不是*char-这里可能重复的更好参考:如果他需要第一个和第二个键,会发生什么?一个
上升
,另一个
下降
?他需要两辆车,一辆一辆key@LuisLL-是的。没有想到:)我在想,
优先级
报告日期
将被排序。但是应该明白…当var1='report\u date'时,这将不起作用。如果报告日期为列类型日期,则转换将失败。如果report_date是datetime,则它将按日期排序,而不是按时间排序。它仅在报告日期不包含timepart@t-clausen.dk谢谢-我已经澄清了。我确实将原始答案限定为“多种类型”(即,并非全部)。幸运的是,OP的Q似乎以非字符串类型为中心。