MySQL вложенная ошибка CASE мне нужна помощь? - PullRequest
1 голос
/ 29 марта 2010

Я пытаюсь сделать следующее: ЕСЛИ записи в таблице todo, определенные в $ done, имеют значение в столбце recurinterval, то THEN сбросить столбец date_scheduled ELSE, просто установите для столбца status_id значение 6.

Это ошибка, которую я получаю от mysql_error () ...

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'CASE recurinterval! = 0 И повторное обращение не равно NULL THEN SET date_sche' в строке 2

Как я могу заставить это утверждение работать?

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 ]

1 голос
/ 29 марта 2010

Дело в том, что вы пытаетесь сделать что-то, что невозможно сделать, используя только один запрос. Вы хотите обновить 1 из 2 столбцов в зависимости от значения вашего поля повторного ввода. Таким образом, в основном вы должны разделить его на 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)

Если вы запустите эти запросы (скорее всего, вы захотите запустить их внутри транзакции, чтобы вы могли откатить изменения, если во время одного из запросов произошла ошибка), вы должны получить нужный результат.

0 голосов
/ 29 марта 2010

Мне кажется, что ваш первый случай в вашем измененном утверждении CASE recurinterval != 0 AND recurinterval IS NOT NULL THEN должен быть IF

0 голосов
/ 29 марта 2010

Я считаю, что вам нужно добавить 'WHEN' после первого ключевого слова CASE. Итак, начало первой строки гласит:

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