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

时间:2010-02-01 15:01:29

标签: 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;

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

3 个答案:

答案 0 :(得分: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;

如果CEIL()始终是浮点值A> 0

,您可能希望使用<= 2

答案 1 :(得分:19)

虽然你肯定可以使用MySQL的IF()控制流功能as demonstrated by dbemerlin's answer,但我怀疑读者可能会更清楚一点(即你自己,以及将来可能会选择代码的任何未来的开发人员)使用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

当然,在这个具体的例子中,在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)

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

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

WHEN

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

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

答案 2 :(得分:6)

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

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

希望这有助于其他人。