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

¿Fue útil?

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 .

En resumen, las declaraciones 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top