MySQL嵌套CASE错误我需要帮助吗?

时间:2010-03-29 06:53:12

标签: php mysql linux nested case

我在这里要做的是:如果在$ done中标识的表todo中的记录在recurinterval列中有一个值,那么THEN reset date_scheduled列ELSE只是为这些记录设置status_id列为6。

这是我从mysql_error()...

得到的错误

您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以便在'CASE recurinterval附近使用正确的语法!= 0和recurinterval IS NOT NULL,然后在第2行设置date_sche'

如何使此声明有效?

UPDATE todo 
CASE recurinterval != 0 AND recurinterval IS NOT NULL THEN
SET date_scheduled = CASE recurunit
WHEN 'DAY' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval DAY)
WHEN 'WEEK' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval WEEK)
WHEN 'MONTH' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval MONTH)
WHEN 'YEAR' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval YEAR)
END
WHERE todo_id IN ($done) 
ELSE 
SET status_id = 6 WHERE todo_id IN ($done)
END

在我修改之前,以下mySQL语句工作得很好。

UPDATE todo 
SET date_scheduled = CASE recurunit
WHEN 'DAY' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval DAY)
WHEN 'WEEK' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval WEEK)
WHEN 'MONTH' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval MONTH)
WHEN 'YEAR' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval YEAR)
END
WHERE todo_id IN ($done) 
AND recurinterval != 0 
AND recurinterval IS NOT NULL

3 个答案:

答案 0 :(得分:1)

问题是你正在尝试做一些只使用一个查询就无法做到的事情。您希望根据recurinterval字段的值更新2列中的1列。所以基本上你应该将它分成2个查询,第一个将是你拥有的那个查询。

UPDATE todo 
SET date_scheduled = CASE recurunit
WHEN 'DAY' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval DAY)
WHEN 'WEEK' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval WEEK)
WHEN 'MONTH' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval MONTH)
WHEN 'YEAR' THEN DATE_ADD(date_scheduled, INTERVAL recurinterval YEAR)
END
WHERE todo_id IN ($done) 
AND recurinterval != 0 
AND recurinterval IS NOT NULL

第二个将用于其他行:

UPDATE todo 
SET status_id = 6
WHERE todo_id IN ($done) 
AND (recurinterval = 0 
OR recurinterval IS NULL)

如果您运行这些查询(很可能您希望在事务中运行它们,以便在其中一个查询期间发生错误时可以回滚更改),您应该得到所需的结果。

答案 1 :(得分:0)

我相信您需要在第一个CASE关键字后添加'WHEN'。所以第一行的开头是:

UPDATE todo CASE WHEN recurinterval !=0 AND ...

答案 2 :(得分:0)

在我看来,您修改后的陈述CASE recurinterval != 0 AND recurinterval IS NOT NULL THEN中的第一个案例实际上应该是IF