Как написать это обновление в MSQL, чтобы обновить несколько строк с другим условием WHERE

#mysql #sql #sql-update

#mysql #sql #sql-обновление

Вопрос:

Я должен закодировать эту логику:

 UPDATE imported 
   SET col1 = 'first' 
 WHERE col2 = 'value one',
   SET col1 = 'second' 
 WHERE col2 = 'value two';
  

В одном запросе будет несколько обновлений, поэтому я не хочу перегружать сервер, выполняя обновление отдельно для каждой строки

Также: если 2 условия могут быть объединены, например, где col2=’this’ И col3=’that’

Ответ №1:

Я добавил пример нескольких условий в CASE инструкцию.

 UPDATE imported
SET col1 = CASE
              WHEN col2 = 'value one' THEN 'first'
              WHEN col2 = 'value two' THEN 'second'
              WHEN col2 = 'other val' AND col3 = 'condition' THEN 'third value'
           END
WHERE col2 IN ('value one', 'value two')
   OR (col2 = 'other val' AND col3 = 'condition')
  

Комментарии:

1. спасибо, это сработало, за исключением того, что оно должно быть END вместо END CASE однако, как я могу добавить другое условие к WHERE в нем, чтобы col3 тоже было чем-то?

2. Я обновил свой ответ, чтобы вы могли увидеть условие where col3.

Ответ №2:

Что-то вроде этого должно сработать:

 update imported
set col1 = case col2
           when 'value one' then 'first'
           when 'value two' then 'second'
           end
where col2 = 'value one'
   or col2 = 'value two'
  

Или вы могли бы просто использовать два обновления:

 update imported set col1 = 'first'  where col2 = 'value one';
update imported set col1 = 'second' where col2 = 'value two';
  

Комментарии:

1. спасибо, получилось с ответом Адамса, но ваш, похоже, тоже работоспособен

Ответ №3:

Обычно я бы использовал два оператора, но вот как это сделать в одном операторе:

 UPDATE imported 
   SET col1 = if(col2 = 'value one', 'first', 'second') 
 WHERE col2 in ('value one', 'value two');
  

В вашем вопросе указаны ровно два варианта, поэтому я использовал краткое if утверждение. Если у вас есть другие условия, лучше используйте case:

 UPDATE imported 
   SET col1 = case col2 
       when 'value one' then 'first'
       when 'value two' then 'second'
       when 'value three' then 'third'
       else 'something else' end 
 WHERE col2 in ('value one', 'value two', 'value three');