在以下查询中,我使用@IsDescOrder
设置顺序。
我尝试指定order by
(即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
我收到错误Incorrect syntax near the keyword 'DESC'.
。
有解决方法吗?
答案 0 :(得分:4)
您的想法正确,但只需要更改CASE
的工作方式即可:
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所指出的,如果订单列为数字,则会导致错误。要解决此问题,请用''
替换空字符串(0
):
ORDER BY
CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE 0 END DESC,
CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE 0 END ASC
这与使用空字符串的解决方案相同,但是可以防止在使用数字列时发生类型转换错误。
答案 1 :(得分: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)