你能在 SQlite Upsert 语句中为不同的 Where 条件链接多个 Do 语句吗

Can you Chain Multiple Do Statements for different Where Conditions in SQlite Upsert Statement

您好,我是 sqlite 的新手,我想在 SQLite 中使用一个更新插入命令 运行。这是 运行ning 在 C# 函数中的命令片段:

$@"INSERT INTO {table} (ToolType, TdxFolderPath, LastProcessedDateFolder, 
                LastProcessedTimeFolder, TdxFileName, LastTriedTimeStamp, Status, ErrorType, ErrorMessage, RetryCount)
                Values (@ToolType, @TdxFolderPath, @LastProcessedDateFolder, @LastProcessedTimeFolder, @TdxFileName,
                @LastTriedTimeStamp, @Status, @ErrorType, @ErrorMessage, @RetryCount)
                    ON CONFLICT (TdxFileName) 
                    DO UPDATE SET ErrorType=excluded.ErrorType, ErrorMessage=excluded.ErrorMessage, RetryCount = RetryCount + 1
                        WHERE excluded.ErrorMessage = ErrorMessage
                    DO UPDATE SET ErrorType=excluded.ErrorType, ErrorMessage=excluded.ErrorMessage, RetryCount = 0
                        WHERE excluded.ErrorMessage != ErrorMessage";

table 变量是一个名为 'ErrorLog_Items' 的 table,对 id 和 TdxFileName 具有唯一性约束。如果文件名已经存在,我想对多个列进行更新。但是,如果文件名已经存在,我插入的错误消息可能与 table 中现有的错误消息相同。在这种情况下,我只想更新一些列并增加重试次数。

但是,如果新的错误消息与 table 中现有的错误消息不同,我想将重试计数重置为 0,同时更新上面命令中显示的某些列。

有没有一种方法可以在一次查询中执行此操作?还是需要多次查询?

您可以使用 CASE 表达式:

.....................................
ON CONFLICT(TdxFileName) 
DO UPDATE SET ErrorType = excluded.ErrorType, 
              ErrorMessage = excluded.ErrorMessage, 
              RetryCount = CASE WHEN excluded.ErrorMessage = ErrorMessage THEN RetryCount + 1 ELSE 0 END

并且不需要 WHERE 子句。