一个查询中的MySQL更新条件(UPDATE,SET& CASE)

时间:2011-08-07 20:28:23

标签: mysql conditional case

如果可能,我正在尝试在单个查询中更新一组记录( boolean字段)。

输入来自分页广播控件,因此给定的POST将包含页面值为truefalse的ID。

我试图走这个方向:

UPDATE my_table
    SET field = CASE
        WHEN id IN (/* true ids */) THEN TRUE
        WHEN id IN (/* false ids */) THEN FALSE
    END

但是这导致“真实ID”行更新为true所有其他行更新为false

我认为我已经犯了一些严重的语法错误,或者说我正在接近这个错误。

对解决方案的任何想法?

3 个答案:

答案 0 :(得分:23)

您是否忘记在案例陈述中做了“ELSE”?

UPDATE my_table
    SET field = CASE
        WHEN id IN (/* true ids */) THEN TRUE
        WHEN id IN (/* false ids */) THEN FALSE
        ELSE field=field 
    END

没有ELSE,我假设评估链在最后一个WHEN处停止并执行该更新。此外,您不限制您尝试更新的行;如果你不做ELSE,你至少应该告诉更新只更新你想要的行而不是所有的行(正如你所做的那样)。查看下面的WHERE子句:

  UPDATE my_table
        SET field = CASE
            WHEN id IN (/* true ids */) THEN TRUE
            WHEN id IN (/* false ids */) THEN FALSE
        END
  WHERE id in (true ids + false_ids)

答案 1 :(得分:5)

您可以避免使用field = field

update my_table
    set field = case
        when id in (....) then true
        when id in (...) then false
        else field
    end

答案 2 :(得分:0)

您可以避免在此任务中使用 case 块,因为您正在设置条件布尔值。

id 子句中声明所有应更改的 WHERE

true 子句的 id 条件中声明所有 SET IN() 值。如果在 id 中找到任何给定的 IN,则布尔值将变为 true,否则为 false

Demo

TABLE `my_table` (
  `id` int(10) UNSIGNED NOT NULL,
  `my_boolean` boolean
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ALTER TABLE `my_table`
  ADD PRIMARY KEY (`id`);
  
INSERT INTO `my_table` VALUES
(1,true),
(2,false),
(3,true),
(4,false),
(5,true),
(6,false);

UPDATE my_table
SET my_boolean = (id IN (2,4))
WHERE id IN (2,3);

SELECT * FROM my_table;

输出:

id  my_boolean
1   true
2   true       #changed
3   false      #changed
4   false
5   true
6   false