Sql server 根据参数按ASC或DESC订购?

Sql server 根据参数按ASC或DESC订购?,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,在下面的查询中,我使用@IsDesOrder设置排序 我试图通过ie.ASC或DESC指定顺序,但出现错误。我可以删除DESC | ASC,但这两个选项将返回相同的集合,因为它将返回默认顺序: declare @IsDescOrder bit = 0 ;with cte as ( select * from ( select *, r = row_number() over (partition by NameId order by case @IsDescO

在下面的查询中,我使用@IsDesOrder设置排序

我试图通过ie.ASC或DESC指定顺序,但出现错误。我可以删除DESC | ASC,但这两个选项将返回相同的集合,因为它将返回默认顺序:

declare @IsDescOrder bit = 0

;with cte as 
(
 select 
 *
 from (
  select *, r = row_number() over (partition by NameId 
  order by 
      case @IsDescOrder 
        when 1 then size_mbps DESC,
        when 0 then size_mbps ASC
      end
  ) 
  from #temp_table 
  ) a 
 where r <= 20
)
select 
* from 
cte 
我在关键字“DESC”附近得到错误语法


有解决办法吗?

您的想法是正确的,但只需要稍微改变一下您的案例的工作方式:

ORDER BY
  CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE '' END DESC,
  CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE '' END ASC
这包含两个要按顺序排列的子句,一个降序子句后跟一个升序子句

当@IsDescOrder为1时,则使用降序子句,否则使用升序子句。通过提供ELSE,可确保有效忽略ASC或DESC中不需要的订单

编辑

正如OP所指出的,如果order列是数字,则会导致错误。要解决此问题,请将空字符串替换为0:


这与使用空字符串的解决方案的工作原理相同,但可以防止在使用数字列时出现类型转换错误。

您的想法是正确的,但只需稍微更改案例的工作方式:

ORDER BY
  CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE '' END DESC,
  CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE '' END ASC
DECLARE @IsDescOrder bit = 1
DECLARE @sql VARCHAR(MAX) = 'SELECT TOP 10 i FROM TEST'
SET @sql = @sql + CASE WHEN @IsDescOrder=1 THEN ' ORDER BY i DESC' ELSE ' ORDER BY i ASC' END
EXEC sp_sqlexec @sql
这包含两个要按顺序排列的子句,一个降序子句后跟一个升序子句

当@IsDescOrder为1时,则使用降序子句,否则使用升序子句。通过提供ELSE,可确保有效忽略ASC或DESC中不需要的订单

编辑

正如OP所指出的,如果order列是数字,则会导致错误。要解决此问题,请将空字符串替换为0:

这与使用空字符串的解决方案的工作原理相同,但可以防止在使用数字列时发生类型转换错误

DECLARE @IsDescOrder bit = 1
DECLARE @sql VARCHAR(MAX) = 'SELECT TOP 10 i FROM TEST'
SET @sql = @sql + CASE WHEN @IsDescOrder=1 THEN ' ORDER BY i DESC' ELSE ' ORDER BY i ASC' END
EXEC sp_sqlexec @sql
您需要的是一个“动态”sql语句。MSSQL的唯一用途是使用“sp_sqlexec”AFAIK


您需要的是一个“动态”sql语句。MSSQL的唯一作用是使用“sp_sqlexec”AFAIK

Duplicate:Asides:注意,case表达式只有一种数据类型。如果将MyTableId(可能是Int)和DateKey(可能是Date)混合使用,则状态规则是结果将始终是日期。某些数据类型,例如Int,可以使用否定:case when@ascending=1,然后FooId else-FooId end进行升序或降序排序。Duplicate:Asides:注意,case表达式只有一种数据类型。如果将MyTableId(可能是Int)和DateKey(可能是Date)混合使用,则状态规则是结果将始终是日期。一些数据类型,例如Int,可以使用否定法进行升序或降序排序:case when@ascending=1然后FooId else-FooId end。谢谢你的回答。我编辑了这个问题,因为我认为ORDER BY在任何查询中都是一样的。它适用于我发布的简单查询,但不适用于我使用的实际查询。我认为这和其他因素有关。若我只包含一个案例,那个么它将返回数据。添加第二个case语句后,将数据类型varchar转换为numeric时出错。@fdkgfosfskjdlsjdlkfsf如果DateKey列为numeric,只需将其更改为0,它就可以正常工作。所以当。。。ELSE 0 END DESC,ETC感谢您的回复。我编辑了这个问题,因为我认为ORDER BY在任何查询中都是相同的。它适用于我发布的简单查询,但不适用于我正在使用的实际查询。我认为这和其他因素有关。若我只包含一个案例,那个么它将返回数据。添加第二个case语句后,将数据类型varchar转换为numeric时出错。@fdkgfosfskjdlsjdlkfsf如果DateKey列为numeric,只需将其更改为0,它就可以正常工作。所以当。。。否则0结束描述等