【问题标题】:T-SQL case error: expressions may only be nested to level 10T-SQL case 错误:表达式只能嵌套到 10 级
【发布时间】:2021-06-02 18:44:08
【问题描述】:

我有以下带有 13 个参数的非嵌套 case 语句(可以看出,只有一个 case 语句)的代码,但我收到一条错误消息

“Case 表达式只能嵌套到第 10 级”。

当我使用较少的参数时它确实有效,但这并没有真正帮助我,因为我需要我所需结果集的所有参数。

select        ID,
              CASE 
              when  sum(Y) between 0 and 30 then 1
              when  sum(Y) between 31 and 70 then 2
              when  sum(Y) between 71 and 100 then 3
              when  sum(Y) between 101 and 200 then 4
              when  sum(Y) between 201 and 300 then 5
              when  sum(Y) between 301 and 400 then 6
              when  sum(Y) between 401 and 500 then 7
              when  sum(Y) between 501 and 600 then 8
              when  sum(Y) between 601 and 700 then 9
              when  sum(Y) between 701 and 800 then 10
              when  sum(Y) between 801 and 900 then 11
              when  sum(Y) between 901 and 1000 then 12
              when  sum(Y) > 1000 then 13 
              end 
from X
group by ID
;

我确实设法解决了这个问题,将我的 case 参数拆分为两个不同的 select 语句,并在它们之间使用 UNION 来获得我所需的结果集,但感觉好像我可以做得更好,因为原始案例论证不是 n 估计

【问题讨论】:

  • 你是sending this to a linked server吗?我不能像写的那样复制这个。这显示没有错误dbfiddle.uk/…
  • 您可以通过将between 101 and 1000 折叠到单个案例分支并使用一些数学计算结果来解决此问题
  • 此时,将当前结果集加入到包含必要范围和最终值的表(表达式)中似乎是一个更好的主意,而不是在 @ 中枚举每个范围987654325@ 子句。
  • @GordonLinoff 我知道。这已经在我原来的评论中超链接了
  • @MartinSmith 。 . .糟糕,我错过了。

标签: sql tsql


【解决方案1】:

最简单的方法是将其加入VALUES 表构造函数(虚拟表)。

由于该值是一个聚合值,因此在相关子查询中执行此操作可能会更容易,而不是将整个内容放入 CTE:

select
    ID,
    (
        SELECT v.val
        FROM (VALUES
              (0,   30,  1),
              (31,  70,  2),
              (71,  100, 3),
              (101, 200, 4),
              (201, 300, 5),
              (301, 400, 6),
              (401, 500, 7),
              (501, 600, 8),
              (601, 700, 9),
              (701, 800, 10),
              (801, 900, 11),
              (901, 1000, 12),
              (1001, 2147483647, 13)
        ) v(nStart, nEnd, val)
        WHERE SUM(y) BETWEEN v.nStart AND v.nEnd
    )
from X
group by ID;

【讨论】:

  • 很遗憾,由于与此查询相关的数据库之外的其他工具,我无法创建新表
  • 呃,这不是一个新表,它是一个 virtual 表构造函数,只对这个查询可见
【解决方案2】:

这是链接服务器的问题。在您的情况下,一种方法是使用算术来简化逻辑:

select ID,
       (case when sum(Y) between 0 and 30 then 1
             when sum(Y) between 31 and 70 then 2
             when sum(Y) between 71 and 100 then 3
             when sum(Y) > 1000 then 13
             else ceiling(sum(Y) / 100.0) + 2
        end) 
from X
group by ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2020-07-03
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多