2011-12-01 18 views
9

tengo una instrucción UPDATE MySQL que utiliza una cláusula CASOMySQL CASO DONDE ... ... then

UPDATE partsList SET quantity = 
CASE 
    WHEN partFK = 1 THEN 4 
    WHEN partFK = 2 THEN 8 
END 
WHERE buildFK = 1; 

Las obras declaración anterior. Sin embargo, cuando elimino una de las instrucciones WHEN, se rompe y el error indica que la cláusula CASE no devuelve nada. ¿Es que la cláusula CASE debe tener más de un CUÁNDO para funcionar?

No sé de antemano cuántas actualizaciones necesitaré, así que estoy tratando de compilar una sola declaración de actualización que pueda manejar una o varias actualizaciones.

Gracias por cualquier idea que pueda proporcionar.

Respuesta

26

No es que el CASE debe tener más de uno, WHEN...THEN, es que debe manejar toda la fecha que se le da.

Si eliminó una de las cláusulas, deja un agujero. p.ej.

UPDATE partsList SET quantity = 
CASE 
    WHEN partFK = 1 THEN 4 
END 
WHERE buildFK = 1; 

Con esta instrucción de actualización, si parkFK es 2, entonces la actualización falla si el caso no puede manejar la entrada.

Puede limitar sus datos de origen agregando otra línea a su cláusula where (por ejemplo, AND partFK in (1,2)), o puede agregar ELSE a la expresión de caso.

UPDATE partsList SET quantity = 
CASE 
    WHEN partFK = 1 THEN 4 
    WHEN partFK = 2 THEN 8 
    ELSE 12 
END 
WHERE buildFK = 1; 

Sin embargo, según la instrucción SQL que ha mostrado, probablemente exista una forma mejor. Presumiblemente, partFK es una clave externa para alguna otra tabla. ¿Puedes sacar el valor de quantity desde allí?

+0

Ahh, ya veo. Había leído que la base de datos evalúa CASE en cada fila, por lo que ahora tiene sentido. La tabla es un enlace entre compilaciones y partes, esta tabla es donde se almacena la cantidad. ¿Puedo usar el valor actual en ELSE? Es decir. ELSE cantidad – CDspace

+0

Sí, 'cantidad ELÁSCA 'debería funcionar. – recf

+1

Impresionante, gracias por aclarar eso para mí. Y para el registro, 'ELSE quantity' sí funcionó. – CDspace