2013-03-26 12 views
5

Ich versuche, die folgende in MySQL zu tun:in COALESCE in MySQL SELECT

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); 

Es klingt für mich sehr gültig. Ich versuche, eine Spalte mit den am besten geeigneten Wert zu aktualisieren. Wenn ich einen Datensatz finden kann, der den 3 Kriterien entspricht -> das ist der, den ich brauche. Sonst die eine passend 2 Kriterien, sonst eine Aufzeichnung, die nur ein Kriterium zusammenbringt.

Ich kann dies in 3 Update-Abfragen, aber ich verstehe nicht, warum das nicht funktioniert. Nach dem manual:

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

Das genau, was ich brauche. aber es gibt den folgenden Fehler:

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'

Bin ich hier etwas fehlt?

+0

Können Sie die Fehlermeldung posten? – Don

+0

Können Sie eine vollständige Abfrage bereitstellen, d. H. Ohne Ihre Verallgemeinerung darin. Es würde helfen, genauere Ratschläge zu geben. –

+0

Es ist nur ein 1064 Syntaxfehler. Meine Abfrage ist im Grunde das. Es gibt einen Syntaxfehler genau bei SELECT innerhalb der COALESCE. – Sherlock

Antwort

9

Ihr Problem ist vermutlich, dass Sie mehr als 1 Z-Wert von den Subselects zurückgegeben bekommen. Du kannst nur eins bekommen.

Sie könnten versuchen:

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 
     ); 

jedoch spezifische Syntaxfehler ist, dass Sie Klammern um die wählt müssen. Das ist also die syntaktisch korrekte Version:

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

Ich habe meinen Beitrag bearbeitet, um den LIMIT 1-Vorschlag aufzunehmen. Der Fehler bleibt bestehen, aber Ihr Weg ist sehr sauber und genau das, was ich brauche. Vielen Dank! – Sherlock

+0

Noch eine Sache; Warum funktioniert COALESCE nicht? Ist nicht genau mein Beispiel, wofür COALESCE steht? – Sherlock

+0

Sie können das a = b auch aus der Groß-/Kleinschreibung entfernen, da die WHERE-Anweisung dies bereits voraussetzt. COALESCE ist für, wenn Sie Werte haben, anstatt Unterabfragen –

2

Es ist schwer, ohne weitere Details zu beraten, aber so etwas wie dies funktionieren kann

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) 
); 

Stellt sicher, dass jede Unterabfrage nur bis zu 1 Zeile zurückgibt.