Предложение SQL - WHERE для каждой команды SET в UPDATE?
-
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, если вы имеете дело со строковыми значениями.