Подтвердить что ты не робот

MySQL CASE для обновления нескольких столбцов

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

UPDATE tablename SET
    CASE name
        WHEN 'name1' THEN col1=5,col2=''
        WHEN 'name2' THEN col1=3,col2='whatever'
        ELSE col1=0,col2=''
    END;

Есть ли способ достижения ожидаемого результата с помощью действительного SQL?

4b9b3361

Ответ 1

UPDATE tablename
SET col1 = CASE WHEN name = 'name1' THEN 5 
                WHEN name = 'name2' THEN 3 
                ELSE 0 
           END
 , col2 = CASE WHEN name = 'name1' THEN '' 
               WHEN name = 'name2' THEN 'whatever' 
               ELSE '' 
          END
;

Ответ 2

Я не знаю никакого чистого способа делать то, что вы просите. Эквивалентное действующее обновление SQL:

UPDATE tablename SET
    col1 = CASE name WHEN 'name1' THEN 5 WHEN 'name2' THEN 3 ELSE 0 END,
    col2 = CASE name WHEN 'name1' THEN '' WHEN 'name2' THEN 'whatever' ELSE '' END;

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

Ответ 3

Если name имеет уникальный индекс и ваши значения, как известно, существуют в таблице, вы можете использовать этот трюк:

INSERT INTO tablename (name, col1, col2)
VALUES ('name1', 5, '')
     , ('name2', 3, 'whatever')
ON DUPLICATE KEY UPDATE
       col1 = VALUES(col1)
     , col2 = VALUES(col2);

Если есть дополнительные столбцы NOT NULL без значения по умолчанию, вам придется добавить фиктивные значения для них. Просто оставьте их из ON DUPLICATE KEY UPDATE, и они будут проигнорированы.