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



嗨,我是sqlite的新手,有一个Upsert命令正在sqlite中运行。这是在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";

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

但是,如果新的错误消息与表中现有的错误消息不同,除了更新上面命令中显示的一些列之外,我还想将retrycount重置为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

并且不需要CCD_ 2子句。

最新更新