仅当一个条件为真时才用于 ON DUPLICATE KEY UPDATE 的 Terser 语法?

Posted

技术标签:

【中文标题】仅当一个条件为真时才用于 ON DUPLICATE KEY UPDATE 的 Terser 语法?【英文标题】:Terser syntax for ON DUPLICATE KEY UPDATE only if one condition is true? 【发布时间】:2020-04-23 08:06:10 【问题描述】:

我知道我可以做类似的事情

ON DUPLICATE KEY UPDATE 
    exampleColumn1 = IF (exampleCondition = 1, VALUES(exampleColumn1), exampleColumn1),
    exampleColumn2 = IF (exampleCondition = 1, VALUES(exampleColumn2), exampleColumn2),
    exampleColumn3 = IF (exampleCondition = 1, VALUES(exampleColumn3), exampleColumn3),
    # Etc etc

但由于我每次都在做完全相同的条件检查,所以肯定有更简洁的方法来写这个吗?在写出条件有点长的情况下,这将特别好。

根据我的阅读,如果我为此编写一个函数似乎是可能的,但我可以在一个普通的旧查询中做到这一点吗?

【问题讨论】:

请向我们展示整个查询。 对于任何 INSERT INTO ... ON DUPLICATE KEY UPDATE ... 格式查询,这意味着更多的一般问题,其中 ON DUPLICATE KEY UPDATE 中的每一列都按顺序应用完全相同的 IF 条件来决定是否更新值。 【参考方案1】:

简而言之:没有。 on duplicate key 语法不支持任何形式的过滤(where 条件等)。

但是,如果您的条件很长,一个技巧是使用用户变量来保存其返回值,您可以在以下分配中重复使用:

on duplicate key update
    exampleColumn1 = if(@do_update := (exampleCondition = 1), values(exampleColumn1), exampleColumn1),
    exampleColumn2 = if(@do_update, values(exampleColumn2), exampleColumn2),
    exampleColumn3 = if(@do_update, values(exampleColumn3), exampleColumn3)

【讨论】:

我记得如果用户变量被初始化并在同一个语句中使用,它们有时会出现意外行为。这不是一个可能的问题吗? @0xN0: 是的,这在select 语句中是正确的,其中列的评估顺序是未定义的,但在updates 中没有,从左到右评估,如explained in the documentation . UPDATE t1 SET col1 = col1 + 1, col2 = col1; : 语句中的第二个赋值将col2 设置为当前(更新的)col1 值,而不是原始的col1 值。结果是col1col2 具有相同的值。此行为不同于标准 SQL。 啊啊啊我明白了。谢谢!

以上是关于仅当一个条件为真时才用于 ON DUPLICATE KEY UPDATE 的 Terser 语法?的主要内容,如果未能解决你的问题,请参考以下文章

仅当在 Android 中单击按钮后条件为真时才启动 Activity

MongoDB $and 仅当 $and 在文档的同一数组索引中为真时才查询 - 特别是对于双重嵌套数组 [重复]

Javascript:<script src=jquery...仅当条件为真时

R:仅当同一列中的两行中的值为真时才将值添加到 [row,column]

仅在条件为真时添加指令 [重复]

根据状态变量进行条件 Yup 验证