【问题标题】:Order by ASC or DESC based on parameter?根据参数按 ASC 或 DESC 排序?
【发布时间】:2019-05-22 16:23:21
【问题描述】:

在以下查询中,我使用@IsDescOrder 来设置排序。

我尝试指定order by(即ASCDESC)但出现错误。我可以删除 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'.

有解决办法吗?

【问题讨论】:

  • 旁白:请注意,case 表达式具有单一数据类型。如果您将MyTableId(可能是Int)和DateKey(可能是Date)混合在一起,那么data type precedence 的规则规定结果将始终是Date。一些数据类型,例如Int,可以使用否定进行升序或降序排序:case when @Ascending = 1 then FooId else -FooId end

标签: sql-server tsql sql-server-2008


【解决方案1】:

你有正确的想法,但只需要稍微改变一下CASE 的工作方式:

ORDER BY
  CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE '' END DESC,
  CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE '' END ASC

这包含两个要排序的子句,一个降序子句后跟一个升序子句。

@IsDescOrder 为 1 时使用降序子句,否则使用升序子句。通过提供ELSE '',这确保了不需要的顺序(ASCDESC)被有效地忽略。

编辑

正如 OP 所指出的,如果订单列是数字,这会导致错误。要解决此问题,请将空字符串 ('') 替换为 0

ORDER BY
  CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE 0 END DESC,
  CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE 0 END ASC

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

【讨论】:

  • 感谢您的回复。
  • 我已经编辑了这个问题,因为我认为ORDER BY 在任何查询中都是一样的。
  • 它适用于我发布的简单查询,但不适用于我正在使用的实际查询。我认为这与ELSE ''有关。
  • 如果我只包含一个case,那么它将返回数据。添加第二个case 语句后,我得到Error converting data type varchar to numeric.
  • @fdkgfosfskjdlsjdlkfsf 如果DateKey 列是数字,那么只需将'' 更改为0,它应该可以正常工作。所以CASE WHEN ... ELSE 0 END DESC
【解决方案2】:
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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2019-08-13
    • 2011-06-28
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多