SQL: ¿cláusula WHERE en cada comando SET en UPDATE?
-
07-07-2019 - |
Pregunta
Estoy tratando de crear una consulta SQL en PHP para actualizar una tabla.
¿Es posible tener una cláusula diferente WHERE
para cada fila afectada?
por ejemplo, algo como:
UPDATE table
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2
etc.?
Cualquier ayuda apreciada. Gracias
Solución
No puede tener varias cláusulas WHERE para ninguna declaración SQL, sin embargo, puede usar una declaración CASE para lograr lo que está tratando de hacer. Otra opción que tiene es ejecutar varias declaraciones de ACTUALIZACIÓN.
Aquí hay una muestra usando la declaración CASE:
UPDATE table
SET val = (
CASE someproperty
WHEN 1 THEN X
WHEN 2 THEN Y
ELSE val
END
);
Aquí hay una muestra usando múltiples declaraciones de ACTUALIZACIÓN:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
Otros consejos
Sí, puedes hacerlo con una declaración CASE.
UPDATE table
SET val = CASE someproperty
WHEN 1 THEN x
WHEN 2 THEN y
....
ELSE
val
END
Ahora, existe la preocupación de que una declaración CASE
sea menos legible en comparación con varias declaraciones UPDATE
. Hay un argumento válido aquí. Por ejemplo, cuando se actualizan 1000 filas, se siente y se ve mejor usar varias declaraciones UPDATE
en lugar de 1000 condiciones diferentes para un solo CASE
.
Sin embargo, a veces una declaración CASE es más apropiada. Si, por ejemplo, está actualizando filas en función de algún rasgo, digamos la naturaleza par o impar del valor de un campo en la tabla, entonces una declaración CASE
es una forma maravillosamente concisa y fácil de actualizar filas en el tabla sin tener que recurrir a un gran número de sentencias UPDATE
que comparten un tipo específico de lógica. Tome esto por ejemplo:
UPDATE table
SET val = CASE MOD(someproperty, 2)
WHEN 0 THEN x
WHEN 1 THEN y
END
Esta expresión toma el módulo de alguna propiedad y, cuando 0 (par), asigna el valor x a val y, cuando 1 (impar), asigna el valor y a val. Cuanto mayor sea el volumen de datos que se actualiza con esta declaración, más limpio se compara con varias declaraciones UPDATE
.
CASE
son a veces tan legibles / mantenibles como las declaraciones UPDATE
. Todo depende de lo que intentes hacer con ellos.
EDITAR : se agregó la cláusula ELSE para que sea más seguro. El OP puede estar interesado en actualizar solo filas específicas, por lo que el resto debe permanecer como antes de la ACTUALIZACIÓN.
EDITAR : se agregó un escenario en el que la declaración CASE
es un enfoque más efectivo que varias declaraciones UPDATE
.
No. Haz dos actualizaciones:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
Pensándolo bien, podría usar subconsultas o la declaración del caso ...
UPDATE table SET val= ( case when someproperty = 1 then X when someproperty = 2 then Y else val END )
Puede que necesite hacer una subconsulta 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
Una forma compacta y fácilmente escalable:
UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '1, 2'), X, Y);
haga la consulta de esta manera:
$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 para evitar errores de sintaxis SQL si maneja valores de cadena.