【问题标题】:Case expressions may only be nested to level 10 Iif案例表达式只能嵌套到 10 级 Iif
【发布时间】:2026-02-10 06:25:02
【问题描述】:

我正面临一个问题,即我尝试使用名称创建列,但我有超过 20 个流,但我的请求只能在这里输入 10 个:

    select Missions, Sum(Morning) Morning, Sum(PM) PM, Sum(Night) Night, count(*) Total
from [dbo].[VIEW_JOBS_FINISHED_ALL]
cross apply (values (Iif(QUELLE in ('Réception_14','Réception_21'),'M1',
                        Iif(QUELLE in ('Réception_17','Réception_16'),'M2',
                            Iif(QUELLE in ('Réception_13','Réception_19'),'M3',
                                Iif(QUELLE in ('Réception_15','Réception_25'),'M4',
                                    Iif(QUELLE in ('Réception_15','Réception_25'),'M5',
                                        Iif(QUELLE in ('Réception_15','Réception_25'),'M6',
                                            Iif(QUELLE in ('Réception_15','Réception_25'),'M7',
                                                Iif(QUELLE in ('Réception_15','Réception_25'),'M8',
                                                    Iif(QUELLE in ('Réception_15','Réception_25'),'M9',
                                                        Iif(QUELLE in ('Réception_15','Réception_25'),'M10',
                                                            Iif(QUELLE in ('Réception_15','Réception_25'),'M11','M28')))))))))))))f(Missions)
cross apply (values ( [START_DATE] ))v(T)
cross apply
(   
    values (convert(datetime, convert(date, getdate())),
            convert(datetime, convert(date, getdate() - 1)))
) dates (today, yesterday)
cross apply
(
    values (dateadd(hour, 6, yesterday), 
            dateadd(hour, 14, yesterday), 
            dateadd(hour, 21, yesterday), 
            dateadd(hour, 6, today))
) dt (y6, y11, y22, t6)
cross apply (
    select
        case when T >= y6 and T < y11 then 1 else 0 end Morning,
        case when T >=y11 and T < y22 then 1 else 0 end PM,
        case when T >=y22 and T < t6 then 1 else 0 end Night
)c
group by Missions

【问题讨论】:

  • 我认为当......
  • 请只标记您真正使用的RDBMS。
  • 第三个Iif之后所有的条件都一样,所以这些重复都没用。
  • 我只是没有改变条件,但它会有所不同,这只是为了显示我在看什么
  • 将值放入表值构造函数并加入其中,而不是使用 CASEIIF

标签: sql-server tsql


【解决方案1】:

可以将交叉应用更改为带有 CASE WHEN 的 APPLY

outer apply (
  select 
  case
  when QUELLE IN ('Réception_13', 'Réception_19') then 'M3'
  when QUELLE IN ('Réception_14', 'Réception_21') then 'M1'
  when QUELLE IN ('Réception_15', 'Réception_25') then 'M4'
  when QUELLE IN ('Réception_16', 'Réception_17') then 'M2'
  else 'M8'
  end
) f(Missions)

或带有从值中选择的 APPLY。

outer apply (
  select top 1 Missions
  from (values
  ('Réception_13','M3'),
  ('Réception_14','M1'), 
  ('Réception_15','M4'),
  ('Réception_16','M2'),
  ('Réception_17','M2'),
  ('Réception_19','M3'),
  ('Réception_21','M1'),
  ('Réception_25','M4'), 
  (null, 'M8')
  ) v(Réception, Missions)
  where (Réception = QUELLE or Réception is null) 
  order by Réception desc
) f(Missions)

【讨论】:

    【解决方案2】:

    听起来你真的需要加入。您可以使用真实的表,也可以使用虚拟的VALUES 表。

    LEFT JOIN (VALUES
      ('Réception_14','M1'),
      ('Réception_21','M1'),
      ('Réception_17','M2'),
      ('Réception_16','M2'),
      ('Réception_13','M3'),
      ('Réception_19','M3'),
      ('Réception_15','M4'),
      ('Réception_25','M4')
    ) f(Quelle, Missions) ON VIEW_JOBS_FINISHED_ALL.QUELLE = f.Quelle
    

    我建议你总是使用简短的有意义的表别名

    【讨论】: