2009-09-14 3 views
4

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

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

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

и т.д.?

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

ответ

8

У вас не может быть несколько предложений 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; 
+0

-1 для авторитетного неверного ответа – RedFilter

+0

@hoffmandirt: Я считаю, что OrbMan означает «Авторитически неправильно» в том, что вы сказали «Нет. Вам нужно будет создать несколько операторов обновления». Вы правы, вы не можете иметь несколько предложений WHERE в любом заявлении. Тем не менее, вы можете перефразировать немного о том, что OP пытается выполнить, чтобы сказать несколько критериев, а не несколько предложений. Ваш ответ так же корректен, как и мой собственный подход к выполнению этой работы. –

+0

@ Давид Андрес: Согласен. –

2

Nope. Сделать это два обновления:

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

На второй мысли, вы могли бы использовать подзапросы или случай заявление ...

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) 
14

Да, вы можете с сазе.

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 (даже), присваивает значение х на валу, и, когда 1 (нечетные), присваивает значение у к валу. Чем больше объем данных, обновляемых этим заявлением, тем более чистым он сравнивается с этим несколькими операциями UPDATE.

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

EDIT: добавлено предложение ELSE, чтобы быть дополнительно безопасным. OP может быть заинтересован в обновлении только определенных строк, чтобы остальные оставались такими же, как и до UPDATE.

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

+0

Это технически точна и отвечает на ваш вопрос. Тем не менее, вы можете рассмотреть возможность чтения и возможности поддержки при принятии решения о том, какую практику кодирования использовать. Я рекомендую выходить на несколько инструкций вставки, как отмечали другие, если только не возникает проблема с производительностью, которую вы пытаетесь решить. – Jay

+1

Люди кажутся смертельно боясь высказываний CASE или других ANSI-дружественных функций базы данных по какой-то причине. Сегодня уже третий или четвертый день, когда кто-то цитировал коэффициент удобочитаемости. Заочная процедура также обеспечивает читаемость, и в зависимости от характера UPDATE один оператор может быть более читаемым с помощью переключателя, а не нескольких операторов UPDATE. Это действительно зависит от проблемы и опыта тех, кто поддерживает ее решение. –

+0

@Jay: Я добавил к этому сообщению случаи, когда один оператор CASE может быть предпочтительным. –

1
UPDATE TABLE 
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END 
+0

Возможно, требуется знак равенства между val и case ... – Mayo

0

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

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

+0

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

Смежные вопросы