根据参数按 ASC 或 DESC 排序?
Order by ASC or DESC based on parameter?
在下面的查询中,我使用 @IsDescOrder
来设置顺序。
我尝试指定 order by
(即 ASC
或 DESC
),但出现错误。我可以删除 DESC | ASC
但两个选项将 return 相同的设置,因为它将 return 默认排序:
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'.
。
有解决办法吗?
你的想法是对的,但只需要稍微改变一下你的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
这与使用空字符串的解决方案的工作原理相同,但可以防止在使用数字列时出现类型转换错误。
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
你想要的是 'dynamic' sql 语句。 MSSQL 只是这样做,你使用 'sp_sqlexec' (AFAIK)
在下面的查询中,我使用 @IsDescOrder
来设置顺序。
我尝试指定 order by
(即 ASC
或 DESC
),但出现错误。我可以删除 DESC | ASC
但两个选项将 return 相同的设置,因为它将 return 默认排序:
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'.
。
有解决办法吗?
你的想法是对的,但只需要稍微改变一下你的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
这与使用空字符串的解决方案的工作原理相同,但可以防止在使用数字列时出现类型转换错误。
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
你想要的是 'dynamic' sql 语句。 MSSQL 只是这样做,你使用 'sp_sqlexec' (AFAIK)