2010-02-01 16 views
32

Come aggiornare una tabella e impostare valori diversi sulla condizione di valutazione su True.MySQL - Utilizzo If Then Else in MySQL UPDATE o SELECT Query

Per esempio:

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

ho visto l'espressione CASE e IF espressione in procedure e funzioni, ma voglio usarlo in un semplice aggiornamento dichiarazione/select. È possibile o mi sto aspettando troppo da questo bel database open source?

risposta

41
UPDATE table 
SET A = IF(A > 0 AND A < 1, 1, IF(A > 1 AND A < 2, 2, A)) 
WHERE A IS NOT NULL; 

si potrebbe desiderare di utilizzare CEIL() se A è sempre un valore in virgola mobile e > 0<= 2

+0

valori di un'una solo esempi. Voglio applicarlo a qualsiasi condizione. Ad esempio: SE A IS NOT NULL è impostato su 'Some Varchar Value' ELSE SET su 'Some Other Varchar Value'; Darò una soluzione alla tua soluzione e vedrò come funziona. Molte grazie! – ThinkCode

+0

hai un debole per quello che stai facendo? Al momento non riesco a vederlo. – inetphantom

6

Ecco una query per aggiornare una tabella basata su un confronto di un'altra tabella. Se il record non viene trovato nella tabellaB, aggiornerà il valore "attivo" a "n". Se viene trovato, imposta il valore su NULL

UPDATE tableA 
LEFT JOIN tableB ON tableA.id = tableB.id 
SET active = IF(tableB.id IS NULL, 'n', NULL)"; 

Spero che questo aiuti qualcun altro.

16

Mentre è certamente possibile usare la funzione di flusso IF() di controllo di MySQL as demonstrated by dbemerlin's answer, ho il sospetto che potrebbe essere un po 'più chiaro al lettore (cioè te stesso, e qualsiasi altro futuro gli sviluppatori che potrebbe raccogliere il codice in futuro) per utilizzare un CASE espressione invece:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     ELSE A 
     END 
WHERE A IS NOT NULL 

Naturalmente, in questo esempio specifico è un po 'dispendioso per impostare A a se stesso nella clausola ELSE-meglio interamente per filtrare tali condizioni dal UPDATE, tramite la clausola WHERE:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     END 
WHERE (A > 0 AND A < 1) OR (A > 1 AND A < 2) 

(Le disuguaglianze comportano A IS NOT NULL).

Oppure, se si desidera che gli intervalli da chiudere piuttosto che aperta (si noti che questo sarebbe impostare i valori di 0-1 -se che non è auspicabile, si potrebbe filtrare esplicitamente tali casi nella clausola WHERE, oppure aggiungere una più elevata la precedenza WHEN condizione):

UPDATE Table 
SET A = CASE 
     WHEN A BETWEEN 0 AND 1 THEN 1 
     WHEN A BETWEEN 1 AND 2 THEN 2 
     END 
WHERE A BETWEEN 0 AND 2 

anche se, come dbmerlin anche sottolineato, per questa specifica situazione si potrebbe considerare l'utilizzo di CEIL() invece:

UPDATE Table SET A = CEIL(A) WHERE A BETWEEN 0 AND 2 
+1

Questa è una presentazione molto più pulita e funziona universalmente anche se ci sono più di due condizioni. La soluzione dell'istruzione 'if()' offerta da @dbemerlin richiede l'annidamento di due condizioni passate, il che renderà la logica ancora più difficile da leggere e capire. –