Условия обновления MySQL в одном запросе (UPDATE, SET & CASE)

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

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

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

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

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

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

Любые мысли о решении?

Ответ 1

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

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)

Ответ 2

Вы можете избежать поля = поле

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