【问题标题】:SQL CASE with WHILE loop in not working带有 WHILE 循环的 SQL CASE 不起作用
【发布时间】:2017-08-08 22:36:12
【问题描述】:

我正在尝试在 CASE 语句中包含 WHILE 循环,但出现以下错误:

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

'.' 附近的语法不正确。

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

我的代码:

SELECT DISTINCT 
  iu.id AS 'number',
  iufv.v AS 'vnumber',
  iufv.timet AS 'time',
  iufv.loc AS 'loc',
  CASE WHEN iufv.timet <= GETDATE() THEN 
    DECLARE @checktime DATE
    SET @checktime = iufv.timet 
    WHILE iufv.timet <= GETDATE()
    BEGIN
      SET iufv.timet = DATEADD(DAY, 42, iufv.timet)
      PRINT @checktime
    End 
  GO
  ELSE 
    iufv.timet 
  END AS nexttime
FROM dbo.iu
       INNER JOIN dbo.iufv ON iu.active_ufv = iufv.gkey
       INNER JOIN dbo.sr ON iu.gkey = sr.applied_to_gkey
WHERE  iufv.ts = 'S4' AND iufv.loc = 'MBUL'

预期输出:

number vnumber time       loc  nexttime
300    v300300 28/12/2016 MBUL 22/03/2017
400    v400400 25/09/2016 MBUL 23/04/2017
500    v500500 18/12/2016 MBUL 23/04/2017

WHILE LOOP的逻辑:

如果时间小于今天的日期,则添加 42 天,

如果它仍然小于今天的日期,再加上 42 天等

直到它大于今天的日期。

【问题讨论】:

  • 你想做什么?这不是查询语法,很难弄清楚你的意图。
  • 你不能用 case 来控制流,它是一个旨在返回标量值的语句。

标签: sql sql-server while-loop


【解决方案1】:

你似乎想要这样的东西:

SELECT DISTINCT iu.id AS number, iufv.v AS vnumber, iufv.timet AS time,
       iufv.loc AS 'loc',
       dateadd(day,
               42 * ((datediff(day, iufv.timet, getdate()) / 42) + 1),
               iufx.timet
              ) as nexttime
FROM dbo.iu INNER JOIN
     dbo.iufv
     ON iu.active_ufv = iufv.gkey INNER JOIN
     dbo.sr
     ON iu.gkey = sr.applied_to_gkey
WHERE  iufv.ts = 'S4' AND iufv.loc = 'MBUL';

【讨论】:

  • 效果很好!只是错过了其中一行的一个小逗号。
【解决方案2】:

DECLARE @checktime DATE 移到您的查询上方。您不能在查询语句内部声明变量。

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2013-08-16
    • 2017-08-01
    • 2015-03-09
    • 2023-03-22
    相关资源
    最近更新 更多