【问题标题】:MySQL update case helpMySQL更新案例帮助
【发布时间】:2011-10-07 17:36:26
【问题描述】:

谁能告诉我如何解决这个问题?

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

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

【问题讨论】:

  • 您需要详细提问。有什么问题?
  • 更好地运行单独的查询。这个会锁定整个表
  • 我遇到了类似的问题,这篇文章让我朝着正确的方向前进(赞成 Quassnoi!),但要非常小心,也要使用 WHERE 语句,否则整个表都会得到 price=如果它不是 3 个声明的 ID 之一,则为 NULL

标签: mysql


【解决方案1】:
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

【讨论】:

  • 我确实试过了,它总是返回价格不能为空(因为我是这样设置的)
  • 可能想为任何其他情况添加显式“else”。
  • 或者也许只是添加一个 where 子句来只更新与您指定的 ID 匹配的项目
  • @Mike:这在您的查询中并不明显。
  • 好吧,对不起,我想这是因为我说的是当列 ID = 'whatever' price = '500' 时
【解决方案2】:
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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 小心这个......它会将数据库中任何其他项目的价格设置为NULL。添加 where 语句(set price is (case...) where id in ("AT259793380","AT271729590","AT275981020"))
    【解决方案4】:

    我假设这是一个 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
    

    【讨论】:

    • +1 很酷的替代方案 dooplenty,但是将更新限制为您真正想要更新的行而不是所有行不是更好吗?
    【解决方案5】:

    您可以尝试一个简单的查询,例如:

    UPDATE `table`
    SET Price = ELT(field(ID,'AT259793380','AT271729590','AT275981020'), '500', '600', '700')
    WHERE ID IN ('AT259793380','AT271729590','AT275981020')
    

    【讨论】:

      【解决方案6】:

      检查mysql错误会发现:

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

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

      最终问题出在后面的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 块中省略。

      【讨论】:

        【解决方案7】:
        update ae44
        set Price = 
        Case ID
        when 'AT259793380' then '500'
        when 'AT271729590' then '600'
        when 'AT275981020' then '700'
        end case
        

        【讨论】:

        • 这段代码是问题代码的副本,具有case ID when 语法而不是case when ID = 语法,并且没有回答问题,因为它没有修复具有@ 的语法错误987654324@(最后一个case 是问题)并将所有其他行的价格字段更新为NULL
        猜你喜欢
        • 2016-08-07
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        相关资源
        最近更新 更多