2013-03-26 19 views
5

che sto cercando di fare quanto segue in MySQL:SELEZIONA in COALESCE in MySQL

UPDATE 
    x 
SET 
    y = COALESCE(SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1, 
       SELECT z FROM table WHERE a = b AND c = d LIMIT 1, 
       SELECT z FROM table WHERE a = b LIMIT 1); 

suona molto valida per me. Sto cercando di aggiornare una colonna con il valore più adatto. Se riesco a trovare un record che corrisponda ai 3 criteri -> questo è quello di cui ho bisogno. Altrimenti quello che soddisfa 2 criteri, altrimenti un record corrispondente a un solo criterio.

Posso farlo in 3 query di aggiornamento, ma non capisco perché questo non funziona. Secondo il manual:

COALESCE returns the first non-NULL value in the list, or NULL if there are no non-NULL values.

Questo è esattamente quello che mi serve. ma dà il seguente errore:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT'

mi manca qualcosa qui?

+0

Puoi pubblicare il messaggio di errore? – Don

+0

Sei in grado di fornire una query completa, cioè senza la tua generalizzazione in là. Sarebbe utile fornire consigli più accurati. –

+0

È solo un errore di sintassi 1064. La mia domanda è fondamentalmente questa. Dà un errore di sintassi esattamente al SELECT all'interno di COALESCE. – Sherlock

risposta

9

Il tuo problema è presumibilmente che stai ricevendo più di 1 valore z restituito dai sottoselezionatori. Puoi solo averne uno

Si potrebbe provare:

update x 
set y = (select z from t where a = b 
     order by (case when a = b and c = d and e = f then 1 
         when a = b and c = d then 2 
         else 3 
        end) 
     limit 1 
     ); 

Tuttavia, il vostro errore di sintassi specifica è che è necessario parentesi intorno alle seleziona. Quindi questa è la versione sintatticamente corretto:

UPDATE 
    x 
SET 
    y = COALESCE((SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1), 
       (SELECT z FROM table WHERE a = b AND c = d LIMIT 1), 
       (SELECT z FROM table WHERE a = b LIMIT 1)); 
+0

Ho modificato il mio post per includere il suggerimento LIMIT 1. L'errore persiste, ma la tua strada è molto pulita ed è esattamente ciò di cui ho bisogno. Grazie! – Sherlock

+0

Un'altra cosa però; perché non funziona COALESCE? Non è il mio esempio esattamente a cosa serve COALESCE? – Sherlock

+0

Puoi anche rimuovere effettivamente a = b dal caso, poiché l'istruzione WHERE lo presuppone già. COALESCE è per quando si hanno valori invece di gestire subquery –

2

E 'difficile consigliare senza ulteriori dettagli, ma qualcosa di simile può funzionare

UPDATE 
    x 
SET y = COALESCE(
    (SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1), 
    (SELECT z FROM table WHERE a = b AND c = d LIMIT 1), 
    (SELECT z FROM table WHERE a = b LIMIT 1) 
); 

assicura che ogni subquery restituisce solo fino a 1 fila.