我发现这个语法用于通过一个查询更新2个mysql行。它看起来很棒,但我不能按照我想要的方式工作。
如果有人能告诉我这种语法是否错误,我会非常感激。 我能正确理解吗?
$id_active = 1;
$id_swap = 2;
UPDATE article_test
// the column to update is 'sort_id' and since it is also the column I need to test, then I use the same value for CASE right?
SET sort_id = CASE sort_id
WHEN $id_active THEN $id_swap // sort_id 1 to become sort_id 2
WHEN $id_swap THEN $id_active // sort_id 2 to become sort_id 1
WHERE sort_id IN ($id_swap,$id_active) // test only rows with sort_id 1 & sort_id 2
答案 0 :(得分:2)
请改为尝试:
UPDATE article_test
SET sort_id =
CASE
WHEN sort_id = $id_active THEN $id_swap
WHEN sort_id = $id_swap THEN $id_active
ELSE sort_id
END
WHERE sort_id IN ($id_swap, $id_active)
请注意:
END
子句。ELSE
子句,则默认值为NULL
。 Update2:为了澄清这一点,CASE
有两种语法。第一个是简化如下:
CASE sort_id
WHEN $id_active THEN $id_swap
WHEN $id_swap THEN $id_active
ELSE sort_id
END
您会看到sort_id
仅在CASE
关键字后指定一次。但是,如果您想添加sort_id IN (1, 2, 3)
或otherfield LIKE ''
等条件,该怎么办?您无法在此简化语法中添加这些条件。您必须以sort_id
关键字之后列出CASE
的方式另外编写,如下所示:
CASE
WHEN sort_id = $id_active THEN $id_swap
WHEN sort_id = $id_swap THEN $id_active
WHEN sort_id LIKE '' THEN blah
ELSE sort_id
END
使用CASE
表达式,使用这两种语法中的任何一种,使用UPDATE
语句,您必须在WHERE
结束后编写CASE
子句表达。你不能在CASE
表达式中将它混合在UPDATE
子句的末尾写入。
答案 1 :(得分:1)
您需要使用ELSE...END
结束您的个案陈述:
UPDATE article_test
SET sort_id = CASE sort_id
WHEN $id_active THEN $id_swap
WHEN $id_swap THEN $id_active
else sort_id end
....