2011-12-01 16 views
9

Ho una dichiarazione UPDATE MySQL che utilizza una clausola caseMySQL CASO ... Dove ... THEN

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

I lavori dichiarazione di cui sopra. Tuttavia, quando rimuovo una delle istruzioni WHEN, si interrompe e l'errore indica che la clausola CASE non restituisce nulla. È che la clausola CASE deve avere più di un WHEN per funzionare.

Non so in anticipo quanti aggiornamenti mi serviranno, quindi sto provando a creare una singola istruzione di aggiornamento in grado di gestire uno o più aggiornamenti.

Grazie per eventuali approfondimenti che è possibile fornire.

risposta

26

Non è che il CASE deve avere più di uno, WHEN...THEN, è che deve gestire tutta la data che gli date.

Se hai rimosso una delle clausole, lasci un buco. per esempio.

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

Con questa istruzione di aggiornamento, se parkFK è 2, quindi l'aggiornamento non riesce perché il caso non è in grado di gestire l'ingresso.

È possibile limitare i dati di origine aggiungendo un'altra riga alla clausola where (ad esempio AND partFK in (1,2)) oppure è possibile aggiungere un ELSE all'espressione case.

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

Tuttavia, in base all'istruzione SQL che hai mostrato, c'è probabilmente un modo migliore. Presumibilmente, partFK è una chiave esterna per qualche altro tavolo. Puoi tirare il valore per quantity da lì?

+0

Ah, capisco. Avevo letto che il database valuta il CASE su ogni riga, quindi ha senso ora. La tabella è un collegamento tra build e parti, questa tabella è dove viene memorizzata la quantità. Posso usare il valore corrente in ELSE? Cioè ELSE quantity – CDspace

+0

Sì, 'ELSE quantity' dovrebbe funzionare. – recf

+1

Fantastico, grazie per averlo chiarito. E per la cronaca, 'ELSE quantity' ha funzionato. – CDspace