SQL - предложение WHERE для каждой команды SET в UPDATE? - PullRequest
6 голосов
/ 14 сентября 2009

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

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

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

и т. Д.

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

Ответы [ 5 ]

14 голосов
/ 14 сентября 2009

Да, вы можете с помощью оператора 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 более уместен. Если, например, вы обновляете строки на основе некоторой черты, скажем, четной или нечетной природы значения поля в таблице, то оператор CASE является удивительно лаконичным и понятным способом обновления строк в таблице без необходимости прибегать к к огромному количеству 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. Все зависит от того, что вы пытаетесь с ними сделать.

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

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

9 голосов
/ 14 сентября 2009

Вы не можете иметь несколько предложений 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;
2 голосов
/ 14 сентября 2009

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

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 )
1 голос
/ 14 сентября 2009
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END
0 голосов
/ 14 сентября 2009

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

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 при работе со строковыми значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...