按顺序使用asc和desc的变量

osh*_*nen 27 sql t-sql sql-server sql-server-2005

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

order by 
case when @var1 = 'priority' then priority end desc,
case when @var2 = 'report_date' then report_date end asc
Run Code Online (Sandbox Code Playgroud)

但是我如何在asc和desc部分使用变量呢?

Lui*_* LL 41

没有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
Run Code Online (Sandbox Code Playgroud)


Nen*_*vic 7

假设你的变量@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
Run Code Online (Sandbox Code Playgroud)


Stu*_*tLC 7

您可以通过引入乘数hack来动态地对许多类型进行排序 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;
Run Code Online (Sandbox Code Playgroud)

SqlFiddle在这里

编辑

只是为了澄清,根据@t-clausen.dk要点,黑客依赖于转换回代表订单的递增数字类型.例如,如果你需要在一个更高的分辨率DATETIME,保证了时间组件在排序也认为,在INT @OrderHack可以被替换为一个FLOATDECIMAL等警告:使用这种技术进行排序*CHAR列可能是具有挑战性的,尤其是如果大小写和重音灵敏度考虑到了.


Dev*_*art 5

试试这个 -

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
Run Code Online (Sandbox Code Playgroud)