Предложение SQL - WHERE для каждой команды SET в UPDATE?

StackOverflow https://stackoverflow.com/questions/1421116

  •  07-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать SQL-запрос в PHP для обновления таблицы.Возможно ли иметь другой WHERE предложение для каждой затронутой строки?

например, что-то вроде:

UPDATE table 
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2

и т.д.?

Любая помощь приветствуется.Спасибо

Это было полезно?

Решение

У вас не может быть нескольких предложений WHERE для любого оператора SQL, однако вы можете использовать оператор CASE для выполнения того, что вы пытаетесь сделать.Другой вариант, который у вас есть, - это выполнить несколько инструкций UPDATE .

Вот пример использования инструкции CASE:

UPDATE table
SET val = (
    CASE someproperty
        WHEN 1 THEN X
        WHEN 2 THEN Y
        ELSE val
    END
);

Вот пример использования нескольких инструкций UPDATE:

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

Другие советы

Да, вы можете с помощью заявления CASE.

UPDATE table
SET val = CASE someproperty  
           WHEN 1 THEN x 
           WHEN 2 THEN y
           ....
          ELSE
           val
          END

Теперь есть опасения, что один CASE утверждение менее читабельно по сравнению с несколькими UPDATE заявления.Здесь есть веский аргумент.Например, когда обновляется 1000 строк, просто кажется и выглядит лучше использовать несколько UPDATE утверждения, а не 1000 различных условий для одного CASE.

Однако иногда более уместным является описание ПРЕЦЕДЕНТА.Если, например, вы обновляете строки на основе какого-либо признака, скажем, четного или нечетного характера значения поля в таблице, то CASE statement - это удивительно краткий и удобный в обслуживании способ обновления строк в таблице без необходимости прибегать к огромному количеству UPDATE утверждения, которые все разделяют определенный тип логики.Возьмем это, к примеру:

UPDATE table
SET val = CASE MOD(someproperty, 2)  
           WHEN 0 THEN x 
           WHEN 1 THEN y
          END

Это выражение принимает модуль someproperty и, когда 0 (четный), присваивает значение x значению val, а когда 1 (нечетный), присваивает значение y значению val.Чем больший объем данных обновляется с помощью этого оператора, тем чище он получается по сравнению с выполнением этого несколькими UPDATE заявления.

Короче говоря, CASE утверждения иногда так же удобочитаемы / поддерживаемы, как UPDATE заявления.Все зависит от того, что вы пытаетесь с ними сделать.

Редактировать:Добавлено предложение ELSE для большей безопасности.OP может быть заинтересован в обновлении только определенных строк, поэтому остальные должны оставаться такими, какими они были до ОБНОВЛЕНИЯ.

Редактировать:Добавлен сценарий, в котором CASE утверждение - это более эффективный подход, чем множественный UPDATE заявления.

Неа.Сделайте это двумя обновлениями:

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

Если подумать, вы могли бы использовать подзапросы или оператор case ...

UPDATE table SET val= ( case when someproperty = 1 then X when someproperty = 2 then Y else val END )

Возможно, вам потребуется сделать это в виде подзапроса, подобного этому:

UPDATE table t1 SET val = ( select CASE when someproperty = 1 then X when someproperty = 2 then Y ELSE val END from table t2 where t1.primarykey = t2.primary key )
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END

Компактный и легко масштабируемый способ:

UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '1, 2'), X, Y);

сделайте запрос таким образом:

$condition = array(1, 2);
$newvals = array('X', 'Y');
$query = "UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '". implode(',', $condition). "', ". implode(', ', $newvals). ")";

Используйте prepare_query, чтобы избежать синтаксических ошибок SQL, если вы имеете дело со строковыми значениями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top