更新案例何时,具有多个条件

时间:2014-11-13 18:04:09

标签: mysql sql sql-update case

我有这张桌子:

CREATE TABLE IF NOT EXISTS `my_table` (
  `A` int(11) NOT NULL,
  `B` int(11) NOT NULL,
  `C` varchar(50) NOT NULL,
  `D` varchar(30) NOT NULL,
  PRIMARY KEY (`A`,`B`,`C`)
)

我想在一个查询中更新几个条目。我试过这个:

UPDATE my_table
SET D = CASE
    WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4'
    WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9'
END

但是此查询会更新表中的所有条目。它完全更新了我想要更新的两个条目的'D'的值,但它也删除了其他条目的“D”值,我希望它们保留其先前的值。

1 个答案:

答案 0 :(得分:8)

如果您没有向else表达式明确添加case子句,则隐式表现为您已将else null添加到其中。因此,您的更新语句实际上等同于:

UPDATE my_table
SET D = CASE
    WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4'
    WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9'
    ELSE NULL
END

这解释了为什么您看到D被删除"。

一种方法是明确添加一个只返回else的{​​{1}}子句:

D

另一种方式,有点" clunkier"语法,但可能会稍微好一点,是添加UPDATE my_table SET D = CASE WHEN (A = 6 AND B = 1 AND C = 'red') THEN '1#2#3#5#4' WHEN (A = 8 AND B = 1 AND C = 'green') THEN '5#6#7#8#9' ELSE D END 子句,只有相关的行更新:

where