【问题标题】:UPDATE multiple fields under same condition (IF or CASE)在相同条件下更新多个字段(IF 或 CASE)
【发布时间】:2015-03-26 18:45:06
【问题描述】:

需要帮助。这里有一些关于这个主题的问题和答案,但没有找到适合我需要的。

我有这两个问题:

UPDATE leilaov
   SET seconds = CASE
      WHEN (mesini = MONTH(NOW()) AND diaini = DAYOFMONTH(NOW()) AND horaini = HOUR(NOW()) AND minutoini <= MINUTE(NOW())) 
        OR (mesini = MONTH(NOW()) AND diaini < DAYOFMONTH(NOW())) 
        OR (mesini = MONTH(NOW()) AND diaini = DAYOFMONTH(NOW()) AND horaini < HOUR(NOW()))
        OR (mesini < MONTH(NOW())) THEN seconds-1
   END
WHERE numero12345 = 1


UPDATE leilaov
   SET seconds = IF((mesini = MONTH(NOW()) AND diaini = DAYOFMONTH(NOW()) AND horaini = HOUR(NOW()) AND minutoini <= MINUTE(NOW())) 
                OR (mesini = MONTH(NOW()) AND diaini < DAYOFMONTH(NOW())) 
                OR (mesini = MONTH(NOW()) AND diaini = DAYOFMONTH(NOW()) AND horaini < HOUR(NOW()))
                OR (mesini < MONTH(NOW())), seconds-1, seconds)
WHERE numero12345 = 1

两者都工作正常,执行时间没有显着差异。 问题是我需要更新几个字段而不仅仅是一个。

更新多个字段的语法是什么?我必须对每个字段重复条件吗?

我应该使用 CASE 还是 IF?还是有更好的选择?

提前致谢。

【问题讨论】:

    标签: mysql if-statement sql-update case


    【解决方案1】:

    很遗憾,您需要为您尝试设置的每个字段重复您的案例。所以你会这样做:

    UPDATE leilaov
       SET seconds = CASE
          WHEN (mesini = MONTH(NOW()) AND diaini = DAYOFMONTH(NOW()) AND horaini = HOUR(NOW()) AND minutoini <= MINUTE(NOW())) 
            OR (mesini = MONTH(NOW()) AND diaini < DAYOFMONTH(NOW())) 
            OR (mesini = MONTH(NOW()) AND diaini = DAYOFMONTH(NOW()) AND horaini < HOUR(NOW()))
            OR (mesini < MONTH(NOW())) THEN seconds-1
       END,
    , second_field = CASE
              WHEN (mesini = MONTH(NOW()) AND diaini = DAYOFMONTH(NOW()) AND horaini = HOUR(NOW()) AND minutoini <= MINUTE(NOW())) 
                OR (mesini = MONTH(NOW()) AND diaini < DAYOFMONTH(NOW())) 
                OR (mesini = MONTH(NOW()) AND diaini = DAYOFMONTH(NOW()) AND horaini < HOUR(NOW()))
                OR (mesini < MONTH(NOW())) THEN seconds-1
           END
    
    WHERE numero12345 = 1
    

    在我看来,您的表结构有问题,或者您应该考虑使用多个查询来解决您的问题。

    编辑:由于我是代码可读性的忠实拥护者,如果性能不是问题并且永远不会,我会分两步完成:

    1. 遍历所有符合条件的记录(在 MySQL 或您选择的后端语言中)
    2. 在更新之前编辑循环内的记录,如果操作正确,则无需重复两次条件。

    过度优化是不好的,在大多数情况下,代码的可读性更重要。

    【讨论】:

    • 感谢@Dany Caissy。关于您对表结构的评论,不幸的是被继承了。
    • 再次感谢@Dany Caissy。你对表结构的评论让我想为什么我认为我继承的东西是理所当然的,你猜怎么着?我重建了这个结构,编码现在更短、更容易、更易读,而且作为奖励,性能也更好。 ;)
    • 酷,别忘了点赞或接受你欣赏的答案。
    • 你好@Dany Caissy!耶稣!!!我真的是这方面的新手。我在哪里或如何支持你的答案???
    • 我的答案左上角有一个“向上”和一个“向下”箭头,围绕着“0”。您还应该可以选择在附近接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2012-06-02
    • 2013-03-31
    相关资源
    最近更新 更多