如何更新表并在条件评估为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语句中使用它。是否有可能或者我对这个可爱的开源数据库抱有太多期待?
答案 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)";
希望这有助于其他人。