【问题标题】:Update Query based on condition根据条件更新查询
【发布时间】:2012-07-13 18:28:40
【问题描述】:

我想做以下事情。 根据另一个字段的值更新一个字段,例如

update table set if(fielda=1){fieldb=2 fieldc=3}else{fieldd=2 fielde=3}

我知道这不是有效的 mysql,但它是我描述问题的最佳方式。

【问题讨论】:

  • 字段的值并不重要。如果 fielda=1 设置 datefielda=now() 否则 datefieldb=now()。我希望这更清楚。
  • 我们使用的“技巧”是将值分配给所有这些列。在我们不想想要更改列的值的情况下,我们只需为其分配当前值。我们使用条件测试 (fielda=1) 来决定我们是分配一个新值,还是保持该值不变。这就是我们通常用来根据一些返回布尔值的逻辑测试有条件地更新列的模式。看我的回答。 juergen d 的回答也是如此。

标签: mysql sql conditional-statements


【解决方案1】:
update table set
b = case when a = 1 then 2 else b end,
c = case when a = 1 then 3 else c end,
d = case when a = 1 then d else 2 end,
e = case when a = 1 then e else 3 end

编辑

根据您的评论试试这个:

update table set
datefield_a = case when field_a = 1 then now() else datefield_a end,
datefield_b = case when field_a <> 1 then now() else datefield_b end

【讨论】:

  • 字段的值并不重要。如果 fielda=1 设置 datefielda=now() 否则 datefieldb=now()。我希望这更清楚。
【解决方案2】:

我认为这种语法会达到您试图指定的结果。

UPDATE mytable
   SET fieldb = CASE WHEN fielda = 1 THEN 2 ELSE fieldb END
     , fieldc = CASE WHEN fielda = 1 THEN 3 ELSE fieldc END
     , fieldd = CASE WHEN fielda = 1 THEN fieldd ELSE 2 END
     , fielde = CASE WHEN fielda = 1 THEN fielde ELSE 3 END

这里的“技巧”是我们正在更新所有四列,但在某些“情况”中,我们将列的当前值分配回列,导致列值没有真正的变化。 (一旦你对这个想法下定了决心,就很容易了。)

对于 MySQL,我们确实有一个方便的 IF 函数(在大多数其他 RDBMS 中不可用),我们可以使用它来简化它,并实现相同的目标:

UPDATE mytable
   SET fieldb = IF(fielda = 1, 2, fieldb)
     , fieldc = IF(fielda = 1, 3, fieldc)
     , fieldd = IF(fielda = 1, fieldd, 2)
     , fielde = IF(fielda = 1, fielde, 3)

痛苦的是您仍然必须多次重复相同的条件测试。

单次扫描表(就像这些语句所做的那样),一口气完成所有这些分配将比分解它并使用多个语句零碎地完成分配更快(并且更有效)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多