Условия обновления MySQL в одном запросе (UPDATE, SET & CASE) - PullRequest
11 голосов
/ 08 августа 2011

Я пытаюсь обновить набор записей (boolean поля ) в одном запросе, если это возможно.

Ввод поступает от постраничного радиоуправления, поэтомуPOST будет иметь идентификатор страницы со значением true или false.

Я пытался пойти в этом направлении:

UPDATE my_table
    SET field = CASE
        WHEN id IN (/* true ids */) THEN TRUE
        WHEN id IN (/* false ids */) THEN FALSE
    END

Но это привело к "строки с истинным идентификатором обновляются до true, а ALL другие строки были обновлены до false.

Я предполагаю, что допустил грубую синтаксическую ошибку или, возможно, я 'Я неправильно подхожу к этому.

Есть мысли о решении?

Ответы [ 2 ]

23 голосов
/ 08 августа 2011

Разве вы не забыли сделать "ELSE" в кейсе?

UPDATE my_table
    SET field = CASE
        WHEN id IN (/* true ids */) THEN TRUE
        WHEN id IN (/* false ids */) THEN FALSE
        ELSE field=field 
    END

Без ELSE я предполагаю, что цепочка оценки останавливается на последнем WHEN и выполняет это обновление. Кроме того, вы не ограничиваете строки, которые пытаетесь обновить; если вы не выполняете ELSE, вы должны, по крайней мере, сказать обновлению, чтобы обновлялись только те строки, которые вы хотите, а не все строки (как вы делаете). Посмотрите на предложение WHERE ниже:

  UPDATE my_table
        SET field = CASE
            WHEN id IN (/* true ids */) THEN TRUE
            WHEN id IN (/* false ids */) THEN FALSE
        END
  WHERE id in (true ids + false_ids)
5 голосов
/ 08 августа 2011

Вы можете избежать field = field

update my_table
    set field = case
        when id in (....) then true
        when id in (...) then false
        else field
    end
...