Pergunta

Eu estou tentando criar uma consulta SQL em PHP para atualizar uma tabela. É possível ter uma cláusula WHERE diferente para cada linha afetada?

por exemplo, algo como:

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

etc?

Qualquer ajuda apreciado. Graças

Foi útil?

Solução

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

Aqui está um exemplo usando a instrução CASE:

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

Aqui está um exemplo usando várias instruções UPDATE:

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

Outras dicas

Sim, você pode com uma instrução CASE.

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

Agora, existe a preocupação de que uma declaração CASE é menos legível quando comparado com várias declarações UPDATE. Não é um argumento válido aqui. Por exemplo, quando 1000 linhas estão sendo atualizados, ele só se sente e parece melhor usar várias declarações UPDATE em vez de 1000 condições diferentes para um único CASE.

No entanto, às vezes uma instrução CASE é mais apropriado. Se, por exemplo, você estiver atualizando linhas com base em alguma característica, dizem que a natureza par ou ímpar do valor de um campo de tabela, em seguida, uma declaração CASE é uma maneira maravilhosamente concisa e de fácil manutenção para atualizar linhas da tabela sem ter que recorrer a um grande número de declarações UPDATE que todos compartilham um tipo específico de lógica. Tome este por exemplo:

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

Esta expressão leva o módulo de SomeProperty e, quando 0 (inclusive), atribui o valor x para val e, quando 1 (ímpar), o valor y cessionários para val. Quanto maior o volume de dados a ser actualizado por esta declaração, o aspirador é comparado a fazê-lo por várias instruções UPDATE.

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

Editar : Adicionado a cláusula ELSE para ser seguro extra. O OP pode ser interessado em atualizar apenas linhas específicas para que o resto deve permanecer como eles antes do UPDATE.

Editar : Adicionado um cenário em que a declaração CASE é uma abordagem mais eficaz do que várias instruções UPDATE.

Não. Faça-o duas alterações:

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

Em segundo pensamento, você poderia usar sub-consultas ou a declaração caso ...

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

Você pode precisar fazer que 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 )
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END

A forma compacta e facilmente escalável:

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

fazer 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). ")";

Use prepare_query a erros de sintaxe SQL evitar se você lidar com valores de cadeia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top