UPDATE in die einzige leere Zeile

alexfrenzel92

SQL-Guru
Beiträge
122
Wie kann ich in einer Tabelle mit 7 Spalten, die Zeile updaten, bei der in Spalte1 (unique) der Wert X steht bzw. eine einzige freie Zelle (der Spalten 2-7) dieser Spalte (falls eine freie Zelle mit dem Wert NULL) vorhanden ist, mit einem bestimmten Wert updaten?

Das Ergebnis wäre eine unveränderte Zeile, nur dass ein NULL-Wert durch einen bestimmten anderen Wert ersetzt wird.

mfg danke
Alex
 
Werbung:
Idealerweise hat jede Tabelle einen Primary Key, aber generell geht die Auswahl der upzudatenden Zeile via der WHERE-Condition.
 
Code:
UPDATE tabelle SET spalte1 = 'asdf' WHERE spalte1 = 'X'

UPDATE tabelle SET spalte2 = 'asdf' WHERE spalte2 IS NULL

UPDATE tabelle SET spalte3 = 'asdf' WHERE spalte3 IS NULL

[...]
 
Demnach würden falls beide Spalten NULL sind, beide aufgefüllt. Wenn mehrere Spalten NULL sind, soll der erste Wert geupdated werden aber der zweite nicht.
Gibt es nicht irgendwas mit IF oder CASE WHEN, sodass man überprüfen kann, ob eine Spalte NULL ist und per ELSE (falls die erste Spalte nicht NULL ist) die nächste Spalte auf NULL überprüft werden kann?

Besser formuliert wäre die Frage vll gewesen, wie IF ELSE in SQL funktioniert.

Gegoogelt würde das nach dem Schema
Code:
IF((SELECT COUNT(*)FROM table1 WHERE project =1)>0)
SELECT product, price FROM table1 WHERE project =1
ELSEIF((SELECT COUNT(*)FROM table1 WHERE project =2)>0)
SELECT product, price FROM table1 WHERE project =2
ELSEIF((SELECT COUNT(*)FROM table1 WHERE project =3)>0)
SELECT product, price FROM table1 WHERE project =3
funktionieren

Hierfür bekomme ich (das jeweils zweite SELECT durch UPDATE ersetzt und ">0" durch alle möglichen ISNULL-Variationen ersetzt): #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 '...' at line 1
 
Hm also dein Statement arbeitet ja nicht Zeilenbasiert, das kann eigentlich keinen Sinn machen. Du solltest vielleicht mit CASE arbeiten, das kann allerdings umfangreich werden.
Code:
UPDATE tabelle
SET spalte1 = (CASE WHEN spalte1 = 'X' OR spalte2 IS NULL AND (spalte3 IS NULL OR spalte4 IS NULL OR spalte5 IS NULL OR spalte6 IS NULL OR spalte7 IS NULL) THEN 'X' ELSE spalte1 END),
spalte2 = (CASE WHEN spalte2 IS NULL AND (spalte3 IS NULL OR spalte4 IS NULL OR spalte5 IS NULL OR spalte6 IS NULL OR spalte7 IS NULL) THEN 'asdf' ELSE spalte2 END)
...
Ich verstehe allerdings die Logik wann welche Spalte NULL ist und wann was gesetzt werden soll nicht. Hört sich auch irgendwie kaputt an.
 
Die Logik dahinter ist eigentlich nicht schwer zu verstehen.

Es gibt drei relevante Spalten. Wenn mindestens eine davon NULL ist, soll genau eine geupdatet werden. Falls zusätzlich andere Spalten NULL sind, die NULL sind, soll nichts passieren. Wenn keine NULL ist, soll nichts passieren.
 
Wie schon gesagt entweder wie oben mit CASE oder in einzelnen Statements, ist vermutlich übersichtlicher:
Code:
UPDATE tabelle
SET spalte1 = 'asdf'
WHERE spalte1 IS NULL
AND ( spalte2 IS NULL OR spalte3 IS NULL )

UPDATE tabelle
SET spalte2 = 'asdf'
WHERE spalte2 IS NULL
AND ( spalte1 IS NULL OR spalte3 IS NULL )
usw.

Ist einfach viel Code aber simpel.
 
Also die Methode/Idee von @ukelele gefällt mir momentan ganz gut.
Wenn man IS NOT NULL einbindet sind es nur drei Abfragen und gar nicht so viel Code.

Kann man die irgendwie in einer Abfrage verbinden?

Wie bei UNION ALL oder mit einem Komma oder so? Dann bliebe es bei einer statt drei Abfragen.
 
UNION ALL oder Komma dienen anderen Zwecken. Der einzige Weg wäre, ein UPDATE zu machen und dann das, was in die Zeilen geschrieben werden soll mit CASE zu bestimmen (siehe Post #5). Das wird aber unübersichtlicher, mehr Code, es wird mehr an der Tabelle aktualisiert und schneller dürfte es auch nicht sein. Es spricht aber aus meiner Sicht nicht viel dagegen alles in drei Schritten zu machen.
 
Werbung:
Zurück
Oben