fdk*_*fsf 1 t-sql sql-server sql-server-2008
在以下查询中,我使用 a@IsDescOrder来设置排序。
我尝试指定order by(ie. ASCor 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
Run Code Online (Sandbox Code Playgroud)
我得到错误Incorrect syntax near the keyword 'DESC'.。
有解决方法吗?
你有正确的想法,但只需要CASE稍微改变一下你的工作方式:
ORDER BY
CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE '' END DESC,
CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE '' END ASC
Run Code Online (Sandbox Code Playgroud)
这包含两个要排序的子句,一个降序子句后跟一个升序子句。
当@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
Run Code Online (Sandbox Code Playgroud)
这与使用空字符串的解决方案相同,但可以防止使用数字列时出现类型转换错误。
| 归档时间: |
|
| 查看次数: |
1286 次 |
| 最近记录: |