提问人:Zenith 提问时间:10/26/2023 更新时间:10/26/2023 访问量:41
SQL 更新集大小写时 else
SQL update set case when else
问:
我正在尝试根据某些条件更新值。我希望编辑以使用此条件的代码如下所示(并且没有该条件即可工作):
UPDATE [SomeSchema].[Synchronization]
SET [SomeSchema] = DATEADD(s, t.Interval, s.[NextSynchronizationMoment])
FROM [SomeSchema].[Synchronization] s
INNER JOIN #syncs ON #syncs.SynchronizationApiSubscriptionId = s.SynchronizationApiSubscriptionId
INNER JOIN [SomeSchema].[SynchronizationTier] t ON s.SynchronizationTierId = t.SynchronizationTierId
此代码根据运行同步的最后一刻 + 同步之间的间隔 IE 设置新的“NextSynchronizationMoment”:DATEADD(s, t.Interval, s.[NextSynchronizationMoment])
问题在于,在某些情况下,过去的同步时刻是很久以前的,以至于我们已经传递了此代码将插入的 NextSynchronizationMoment。在这种情况下,NextSynchronizationMoment 应为DATEADD(s, t.Interval, GETDATE())
因此,我进行了以下更改以适应这种情况:
UPDATE [SomeSchema].[Synchronization]
SET [NextSynchronizationMoment] = CASE
WHEN DATEDIFF(s, GETDATE(), s.[NextSynchronizationMoment]) < t.Interval
THEN DATEADD(s, t.Interval, s.[NextSynchronizationMoment])--REGULAR SYNC
ELSE DATEADD(s, t.Interval, GETDATE()--SYNC WAS PREVIOUSLY MISSED, SKIP MISSED SYNCS
FROM [SomeSchema].[Synchronization] s
INNER JOIN #syncs ON #syncs.SynchronizationApiSubscriptionId = s.SynchronizationApiSubscriptionId
INNER JOIN [SomeSchema].[SynchronizationTier] t ON s.SynchronizationTierId = t.SynchronizationTierId
可悲的是,此查询在 FROM 关键字上被标记为无效,几乎没有解释:“FROM 附近的语法不正确”。我不清楚为什么会发生这种情况。此平台上的其他解决方案不使用联接,因此不需要 FROM 关键字。我不明白为什么会这样。
如何调整此查询以符合所讨论的条件?
答:
您尚未关闭 :CASE
END
UPDATE [SomeSchema].[Synchronization]
SET [NextSynchronizationMoment] = CASE
WHEN DATEDIFF(s, GETDATE(), s.[NextSynchronizationMoment]) < t.Interval
THEN DATEADD(s, t.Interval, s.[NextSynchronizationMoment])--REGULAR SYNC
ELSE DATEADD(s, t.Interval, GETDATE())--SYNC WAS PREVIOUSLY MISSED, SKIP MISSED SYNCS
END -- end the CASE statement ;)
FROM [SomeSchema].[Synchronization] s
INNER JOIN #syncs ON #syncs.SynchronizationApiSubscriptionId = s.SynchronizationApiSubscriptionId
INNER JOIN [SomeSchema].[SynchronizationTier] t ON s.SynchronizationTierId = t.SynchronizationTierId
我发现缩进其中的表达式会有所帮助,这可以帮助您识别何时忘记用 .
CASE
END
在 UPDATE 语句中使用 CASE |Microsoft 学习
还要检查是否关闭了打开的每个带括号的表达式,如果表达式以函数调用结尾,则经常会错过右括号:
DATEADD(s, t.Interval, GETDATE())
弄清楚这一点的关键在于错误消息本身:
'Incorrect syntax near FROM'
在这样的 SQL 错误消息中,通常意味着紧接在之前。因此,当生成错误消息时,它将包含查询中的下一个未处理的表达式。near FROM
评论
case when
应该以 also 结尾,您在最后一个日期中缺少 ) 添加END