SQL-onde está a cláusula em cada comando SET na actualização?

estou a tentar criar uma consulta SQL no PHP para actualizar uma tabela. É possível ter uma cláusula WHERE diferente para cada linha afectada?

Eg algo do género:

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

Etc?

qualquer ajuda apreciada. Obrigado.

Author: Juan Mellado, 2009-09-14

5 answers

Você não pode ter múltiplas cláusulas onde para qualquer declaração SQL, no entanto você pode usar uma declaração de caso para realizar o que você está tentando fazer. Outra opção que você tem é executar várias declarações de atualização.

Aqui está uma amostra usando a instrução do caso:

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

Aqui está uma amostra usando várias declarações de actualização:

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
 9
Author: Dan Polites, 2009-09-14 17:22:49
Sim, pode com uma declaração do caso.
UPDATE table
SET val = CASE someproperty  
           WHEN 1 THEN x 
           WHEN 2 THEN y
           ....
          ELSE
           val
          END

Agora, há preocupação de que uma declaração CASE é menos legível quando comparada com várias declarações UPDATE. Há aqui um argumento válido. Por exemplo, quando 1000 linhas estão sendo atualizadas, apenas se sente e parece melhor usar várias declarações UPDATE em vez de 1000 condições diferentes para um único CASE.

No entanto, por vezes, uma declaração de caso é mais apropriada. Se, por exemplo, estiver a actualizar as linhas com base alguma característica, digamos a natureza par ou ímpar do valor de um campo a tabela, então uma declaração CASE é uma forma maravilhosamente concisa e mainalizável de atualizar as linhas na tabela sem ter que recorrer a um grande número de declarações UPDATE que todos compartilham um tipo específico de lógica. Veja isto por exemplo:

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

Esta expressão toma o módulo de alguma propriedade e, quando 0 (par), atribui o valor x a val e, quando 1 (ímpar), atribui o valor y a val. Quanto maior for o volume de dados a ser actualizado por esta afirmação, o mais limpo é comparado a fazê-lo por múltiplas declarações UPDATE.

Em resumo, CASE as declarações são, por vezes, tão legíveis/passíveis de manutenção como UPDATE As declarações. Tudo depende do que você está tentando fazer com eles.

EDIT : adicionou a outra cláusula para ser extra seguro. O OP pode estar interessado em atualizar apenas linhas específicas para que o resto deve permanecer como eles antes da atualização.

Editar : adicionou um cenário em que o CASE a declaração é uma abordagem mais eficaz do que múltiplas declarações UPDATE.

 14
Author: David Andres, 2009-09-14 17:41:32
Não. Faça duas atualizações:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

Pensando melhor, pode usar sub-consultas ou a instrução do caso...

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

Você pode precisar fazer isso uma sub consulta como esta:

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 )
 2
Author: Kieveli, 2009-09-14 12:01:14
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END
 1
Author: Ertugrul Kara, 2009-09-14 12:04:16

Uma forma compacta e facilmente escalável:

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

Faça a consulta desta forma:

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

Utilize o preparo_ Query para evitar erros de sintaxe SQL se lidar com valores de texto.

 0
Author: culebrón, 2009-09-14 12:05:46