MySQL更新案例帮助

时间:2011-07-18 14:10:27

标签: mysql

有人能告诉我如何修复此查询吗?

update ae44
set Price = Case
when ID = 'AT259793380' then '500'
when ID = 'AT271729590' then '600'
when ID = 'AT275981020' then '700'
end case

我只想通过匹配ID来批量更新基于ID的上市价格。

6 个答案:

答案 0 :(得分:34)

UPDATE  ae44
SET     price =
        CASE
        WHEN ID = 'AT259793380' THEN
                '500'
        WHEN ID = 'AT271729590' THEN
                '600'
        WHEN ID = 'AT275981020' THEN
                '700'
        END

请注意,此查询会将包含其他ID的记录的价格更新为NULL

如果您只想更新列表中的ID,请使用:

UPDATE  ae44
JOIN    (
        SELECT  'AT259793380' AS oldval, '500' AS newval
        UNION ALL
        SELECT  'AT271729590' AS oldval, '600' AS newval
        UNION ALL
        SELECT  'AT275981020' AS oldval, '700' AS newval
        ) q
ON      ae44.id = q.oldval
SET     price = q.newval

答案 1 :(得分:26)

UPDATE ae44 SET
    Price = CASE
    WHEN ID = 'AT259793380' THEN '500'
    WHEN ID = 'AT271729590' THEN '600'
    WHEN ID = 'AT275981020' THEN '700'
    ELSE Price END

或者您可以使用WHERE:

UPDATE ae44 SET
    Price = CASE
    WHEN ID = 'AT259793380' THEN '500'
    WHEN ID = 'AT271729590' THEN '600'
    WHEN ID = 'AT275981020' THEN '700'
    END
WHERE 
    ID IN ('AT259793380', 'AT271729590', 'AT275981020')

并设置LIMIT也是个好主意:

UPDATE ae44 SET
    Price = CASE
    WHEN ID = 'AT259793380' THEN '500'
    WHEN ID = 'AT271729590' THEN '600'
    WHEN ID = 'AT275981020' THEN '700'
    END
WHERE 
    ID IN ('AT259793380', 'AT271729590', 'AT275981020')
LIMIT 3

答案 2 :(得分:4)

删除第二个“案例”,它将起作用:

UPDATE ae44
SET Price = (CASE
WHEN ID = 'AT259793380' THEN '500'
WHEN ID = 'AT271729590' THEN '600'
WHEN ID = 'AT275981020' THEN '700'
END)

答案 3 :(得分:2)

我假设这是一个mysql查询。您可以使用Quassnoi发布的第一个查询,只需添加

WHEN ID THEN price

作为最后的“WHEN”。这样可以防止将所有价格字段设置为空

UPDATE  ae44
    SET price =
    CASE
    WHEN ID = 'AT259793380' THEN '500'
    WHEN ID = 'AT271729590' THEN '600'
    WHEN ID = 'AT275981020' THEN '700'
    WHEN ID THEN price
    END

答案 4 :(得分:0)

检查mysql错误会发现:

<块引用>

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以使用正确的语法 靠近 '='AT275981020' 然后是 '700' 结束案例'

我不知道您是否认为可以将 case 写为别名,或者该别名可以用来做什么。也许这只是您在 CASE 查询中找到的另一个 SELECT 块的错误复制面食。

最终,问题在于尾随的 case。删除最后一个词后,查询将执行,但还有更多内容需要解释。

在我自己的项目中,我将使用更简洁的 CASE 语法变体,其中 ID 只编写一次,而不是在每种情况下都编写大部分冗余表达式。

我还建议使用小写的列名,以便人类更容易阅读 sql。

UPDATE ae44 SET
Price = CASE ID
    WHEN 'AT259793380' THEN '500'
    WHEN 'AT271729590' THEN '600'
    WHEN 'AT275981020' THEN '700'
END
WHERE 
    ID IN ('AT259793380','AT271729590','AT275981020')

添加 WHERE 原因后,只有 3 行会被列入白名单以进行可能的修改——因此可以安全地从 ELSE 块中省略 CASE

答案 5 :(得分:-2)

update ae44
set Price = 
Case ID
when 'AT259793380' then '500'
when 'AT271729590' then '600'
when 'AT275981020' then '700'
end case