Sql server 根据参数按ASC或DESC订购?
在下面的查询中,我使用@IsDesOrder设置排序 我试图通过ie.ASC或DESC指定顺序,但出现错误。我可以删除DESC | ASC,但这两个选项将返回相同的集合,因为它将返回默认顺序: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
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”AFAIKDuplicate: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结束描述等