SQL 更新集大小写时 else

SQL update set case when else

提问人:Zenith 提问时间:10/26/2023 更新时间:10/26/2023 访问量:41

问:

我正在尝试根据某些条件更新值。我希望编辑以使用此条件的代码如下所示(并且没有该条件即可工作):

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 关键字。我不明白为什么会这样。

如何调整此查询以符合所讨论的条件?

Server T-SQL SQL 更新 案例

评论

3赞 siggemannen 10/26/2023
case when应该以 also 结尾,您在最后一个日期中缺少 ) 添加END
0赞 Zenith 10/26/2023
@siggemannen我之前尝试过 END,但遇到了类似错误。缺少)是问题所在。谢谢!

答:

1赞 Chris Schaller 10/26/2023 #1

您尚未关闭 :CASEEND

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

我发现缩进其中的表达式会有所帮助,这可以帮助您识别何时忘记用 .CASEEND

在 UPDATE 语句中使用 CASE |Microsoft 学习

还要检查是否关闭了打开的每个带括号的表达式,如果表达式以函数调用结尾,则经常会错过右括号:

DATEADD(s, t.Interval, GETDATE())

弄清楚这一点的关键在于错误消息本身:

 'Incorrect syntax near FROM'

在这样的 SQL 错误消息中,通常意味着紧接在之前。因此,当生成错误消息时,它将包含查询中的下一个未处理的表达式。near FROM