27

我想使用 case 语句更新表中的多个列,但我找不到如何执行此操作(这甚至可能)。我想出了以下无效的参考查询:

UPDATE tablename SET
    CASE name
        WHEN 'name1' THEN col1=5,col2=''
        WHEN 'name2' THEN col1=3,col2='whatever'
        ELSE col1=0,col2=''
    END;

有什么方法可以使用有效的 SQL 实现预期结果?

4

3 回答 3

41
UPDATE tablename
SET col1 = CASE WHEN name = 'name1' THEN 5 
                WHEN name = 'name2' THEN 3 
                ELSE 0 
           END
 , col2 = CASE WHEN name = 'name1' THEN '' 
               WHEN name = 'name2' THEN 'whatever' 
               ELSE '' 
          END
;
于 2012-12-02T21:16:18.250 回答
9

我不知道有什么干净的方法来做你所要求的。等效的有效 SQL 更新将是:

UPDATE tablename SET
    col1 = CASE name WHEN 'name1' THEN 5 WHEN 'name2' THEN 3 ELSE 0 END,
    col2 = CASE name WHEN 'name1' THEN '' WHEN 'name2' THEN 'whatever' ELSE '' END;

当然,这并不漂亮,需要'name1'多次重复相同的情况(例如),但我只是认为不可能有任何其他方式。

于 2012-12-02T21:16:56.860 回答
1

如果name有一个唯一索引并且你的值已知存在于表中,你可以使用这个技巧:

INSERT INTO tablename (name, col1, col2)
VALUES ('name1', 5, '')
     , ('name2', 3, 'whatever')
ON DUPLICATE KEY UPDATE
       col1 = VALUES(col1)
     , col2 = VALUES(col2);

如果有任何其他NOT NULL列没有默认值,则必须为它们添加虚拟值。只需将它们排除在外,ON DUPLICATE KEY UPDATE它们就会被忽略。

于 2016-08-25T23:29:59.387 回答