【问题标题】:Using case statement before order by clause在 order by 子句之前使用 case 语句
【发布时间】:2021-01-19 07:12:51
【问题描述】:

我想在 Order By 之前有一个条件语句。

在下面的查询中,Marks 有可能为空,在这种情况下,我想按 Rank Asc 排序

SELECT TOP 1 P.[Score]
FROM dbo.[Profile] P
WHERE P.[ProfileId] = @ProfileId
ORDER BY P.[Marks] DESC AS [ProfileScore]

我尝试将其更改为以下方式,但它给出了编译错误

SELECT TOP 1 P.[Score]
FROM dbo.[Profile] P
WHERE P.[ProfileId] = @ProfileId 
ORDER BY 
    (CASE WHEN P.[Marks] IS NOT NULL THEN P.[Marks] END) DESC,
    (CASE WHEN P.[Marks] IS NULL THEN P.[Rank] END) ASC AS [ProfileScore]

但它给出了一个错误:

关键字“DESC”附近的语法不正确

【问题讨论】:

  • case 是一个表达式而不是一个语句。请告诉我们错误。从 order by 中删除“AS [ProfileScore]”,您不使用别名 order by 条款。
  • 除非表中的所有标记都为 NULL,否则您的原始查询仍将按最高标记对数据进行排序到最低标记,然后仅选择前 1 行。同样正如@Dale 提到的,删除AS [ProfileScore]。
  • 您的ORDER BY 中有太多AS [ProfileScore]。您不能在 ORDER BY 中创建别名。
  • 嗨 Dale,当我执行查询时,它在关键字“DESC”附近显示 InCorrect syntax,我如何为我的 P.[Score] 取别名?
  • 你为什么要给它起别名?它只用在order by子句中,别名没有意义。

标签: sql-server sql-order-by case-statement


【解决方案1】:

您的ORDER BY 中有太多AS [ProfileScore]。您不能在 ORDER BY 中创建别名。

如果Marks 和Rank 都是数字,我建议:

SELECT TOP 1 P.[Score]
FROM dbo.[Profile] P
WHERE P.[ProfileId] = @ProfileId 
ORDER BY CASE WHEN P.[Marks] IS NULL THEN P.[Rank] ELSE -P.[Marks] END;

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多