MySQL - 在MySQL UPDATE或SELECT Queries中使用If Then Else

Thi*_*ode 40 mysql

如何在评估为True的条件下更新表并设置不同的值.

例如 :

UPDATE Table
SET A = '1' IF A > 0 AND A < 1
SET A = '2' IF A > 1 AND A < 2
WHERE A IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

我在过程和函数中看到了CASE表达式和IF表达式,但我想在一个简单的update/select语句中使用它.是否有可能或者我对这个可爱的开源数据库有太多期待?

Mor*_*dur 52

UPDATE table
SET A = IF(A > 0 AND A < 1, 1, IF(A > 1 AND A < 2, 2, A))
WHERE A IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

您可能想要使用CEIL()if A始终是浮点值> 0<= 2


egg*_*yal 23

虽然您肯定可以使用MySQL的IF()控制流功能,正如dbemerlin的答案所证明的那样,但我怀疑对于读者(即您自己以及将来可能会接收您的代码的未来开发人员)来说,使用CASE表达式可能会更清楚:

UPDATE Table
SET    A = CASE
         WHEN A > 0 AND A < 1 THEN 1
         WHEN A > 1 AND A < 2 THEN 2
         ELSE A
       END
WHERE  A IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

当然,在这个具体的例子A中,在ELSE子句中设置自己有点浪费- 更好地完全UPDATE通过WHERE子句过滤这些条件:

UPDATE Table
SET    A = CASE
         WHEN A > 0 AND A < 1 THEN 1
         WHEN A > 1 AND A < 2 THEN 2
       END
WHERE  (A > 0 AND A < 1) OR (A > 1 AND A < 2)
Run Code Online (Sandbox Code Playgroud)

(不平等需要A IS NOT NULL).

或者,如果您希望关闭间隔而不是打开(请注意,这将设置01-if的值,这是不合需要的,可以在WHERE子句中明确过滤此类情况,或者添加更高的优先级WHEN条件):

UPDATE Table
SET    A = CASE
         WHEN A BETWEEN 0 AND 1 THEN 1
         WHEN A BETWEEN 1 AND 2 THEN 2
       END
WHERE  A BETWEEN 0 AND 2
Run Code Online (Sandbox Code Playgroud)

尽管如同dbmerlin也指出的那样,对于这种特殊情况,您可以考虑使用CEIL():

UPDATE Table SET A = CEIL(A) WHERE A BETWEEN 0 AND 2
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更清晰的演示文稿,即使存在两个以上的条件,也能通用。@dbemerlin 提供的 `if()` 语句解决方案需要嵌套过去的两个条件,这将使逻辑更难以阅读和理解。 (2认同)

Joh*_*oom 6

这是一个基于另一个表的比较来更新表的查询.如果在tableB中找不到记录,它会将"活动"值更新为"n".如果找到,则将值设置为NULL

UPDATE tableA
LEFT JOIN tableB ON tableA.id = tableB.id
SET active = IF(tableB.id IS NULL, 'n', NULL)";
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他人.