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.
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;
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
.
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 )
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END
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.