【发布时间】:2012-07-26 16:15:37
【问题描述】:
为什么我不能像这样使用 IF
UPDATE my_users
IF(position2 = 18, "SET position = 17", ''),
IF(position2 = 17, "SET position = 16", ''),
IF(position2 = 16, "SET position = 15", ''),
WHERE user_id => 170 AND user_id <= 1000
唯一有效的是
UPDATE my_users
SET position2 = IF(position2 = 18, 17,
IF(position2 = 17, 16,
IF(position2 = 16, 15, ''
)
)
)
WHERE user_id => 170 AND user_id <= 1000
有没有办法以任何其他方式制作相同的东西,因为我有超过 40 个条件用于该字段位置 2 并且它很容易以这种方式迷路?
编辑:
如果我跑了
UPDATE my_users
SET position2 = CASE position2 WHEN 18 THEN 17
WHEN 17 THEN 16
WHEN 16 THEN 15
END
WHERE user_id => 170 AND user_id <= 1000
当position2 不是 CASE 语句中的任何内容时,它会将其设置为空,我如何才能保持 CASE 语句中的值以外的任何值相同
编辑 2: 我想解决方案是:
UPDATE my_users
SET position2 = CASE position2 WHEN 18 THEN 17
WHEN 17 THEN 16
WHEN 16 THEN 15
ELSE position2
END
WHERE user_id => 170 AND user_id <= 1000
编辑 3: 如果我的请求不是一次性的,那么更快的请求将按照 Vatev 的建议进行
UPDATE my_users
SET position2 = CASE position2 WHEN 18 THEN 17
WHEN 17 THEN 16
WHEN 16 THEN 15
END
WHERE user_id => 170 AND user_id <= 1000
AND position2 >= 16 and <= 18
【问题讨论】:
-
看看CASE。
-
顺便说一句,如果你想减少列,你可以
SET position2 = position2-1;。 -
我在主帖中添加的另一个问题
-
只需添加 ELSE 子句,例如 ...
ELSE position2 END。或者只用 position2-1 更新 position2 IN (16,17,18) 的那些行,这样会更好。 -
正确的方法是将
AND position2 IN (16,17,18)添加到您的 WHERE 子句中。您也可以像这样CASE position2 WHEN .. THEN .. ELSE position2 END放置一个“默认”案例。
标签: mysql if-statement