2012-03-15 10 views
6

Voglio aggiornare una tabella in MySQL come questo:Come utilizzare If Then Else in una query di aggiornamento MySQL?

UPDATE Table 
SET A = '20' IF A > 20 
SET A = A IF A < 20 
SET A = 0 IF A <= 1 
WHERE A IS NOT NULL; 

ma quanto sopra SQL non è valido sintassi. Ho anche provato questo:

UPDATE table 
SET A = IF(A > 20, 20, IF(A < 20, A, 0)); 

Ma è anche Sintassi non valida. Come faccio a utilizzare un'istruzione if in una query di aggiornamento come questa?

+1

Non è necessario il secondo caso. Set A = A non fa nulla. Filtrare questo nella clausola where, dovrebbe essere più veloce: 'WHERE A IS NOT NULL AND (A> 20 OR A <= 1)' – Andre

risposta

9

penso che eri il 99% non vi:

UPDATE table 
SET A = IF(A > 20, 20, IF(A < 20 && A > 1, A, 0)) 
WHERE A IS NOT NULL; 

Aggiungere il && A > 1 alla seconda istruzione IF e la vostra terza condizione è soddisfatta.

Edit:

Per @ commento di Andre alla domanda e la suggestione che la nidificato IF è difficile da leggere, si potrebbe anche fare questo come un paio di query che non fanno alcun lavoro inutile e sono leggibili:

UPDATE table SET A = 20 WHERE A > 20; 
UPDATE table SET A = 0 WHERE A <= 1; 

Quando a è NULL, non si incontreranno una di queste condizioni, ed elimina quindi la necessità di specificare che a non essere NULL.

Successivamente, non è necessaria la terza condizione, come suggerito da @Andre. Se A è tra 1 e 20, viene lasciato così com'è.

Infine, l'impostazione da A a 0 dove A è minore o uguale a 1 sembra inusuale. I valori di 1 verranno modificati in 0. Se si intende semplicemente impostare valori inferiori a 1 (inclusi i valori negativi) su 0, è necessario sostituire lo < per <=.

+0

pensi che sia facile da leggere? io non! –

5
UPDATE Table 
SET A = Case 
When A > 20 Then 20 
When A <= 1 Then 0 
End 
WHERE A IS NOT NULL and (A > 20 or A <= 1) 

o più semplicemente, 2 dichiarazioni

UPDATE Table 
SET A = 20 
where A > 20; 

UPDATE Table 
SET A = 0 
where A <= 1; 
+1

I casi non devono omettere le virgolette singole per utilizzare i valori int (piuttosto che una stringa letterale come '20' e 'A' ecc.)? – JYelton

+0

suo illustrativo, il suo originale ha disallineamenti di tipo simile che non volevo indovinare –

+0

Buon punto. Anche se se il valore memorizzato è un int, confrontandolo con '20' funzionerà in mysql, allo stesso modo impostandolo su '20' funzionerà anche, dato che mysql valuterà e convertirà la stringa <-> int. Tuttavia, "A" provocherà un errore di tipo. – JYelton

Problemi correlati