仅当一个条件为真时才用于 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
语句中是正确的,其中列的评估顺序是未定义的,但在update
s 中没有,从左到右评估,如explained in the documentation . UPDATE t1 SET col1 = col1 + 1, col2 = col1;
: 语句中的第二个赋值将col2
设置为当前(更新的)col1
值,而不是原始的col1
值。结果是col1
和col2
具有相同的值。此行为不同于标准 SQL。
啊啊啊我明白了。谢谢!以上是关于仅当一个条件为真时才用于 ON DUPLICATE KEY UPDATE 的 Terser 语法?的主要内容,如果未能解决你的问题,请参考以下文章
仅当在 Android 中单击按钮后条件为真时才启动 Activity
MongoDB $and 仅当 $and 在文档的同一数组索引中为真时才查询 - 特别是对于双重嵌套数组 [重复]
Javascript:<script src=jquery...仅当条件为真时