如何在评估为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).
或者,如果您希望关闭间隔而不是打开(请注意,这将设置0为1-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)
这是一个基于另一个表的比较来更新表的查询.如果在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)
希望这有助于其他人.