Seite 1 von 1

NULL Werte mit 0 ersetzen

Verfasst: Di, 24. Mär 2015 15:00
von satmax
MS SQL 2008R2
Ich möchte in einer Table alle NULL Werte mit 0 ersetzen, als so:

UPDATE myTable SET myField = 0 WHERE myField IS NULL

geht aber nicht:
Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird. Die Anweisung wurde beendet.
Ich brauche das mehrfach und wollte nicht ein eigenes Programm dafür schreiben, gibt da eventuell einen Trick dafür?

Re: NULL Werte mit 0 ersetzen

Verfasst: Di, 24. Mär 2015 15:39
von georg
Hallo, Markus -


ist Dein Beispiel vollständig? Eine "Unterabfrage" ist meist ein weiteres SELECT in der Abfrage, etwa so:

UPDATE mytable SET myField = x WHERE myKey IN (SELECT theKey FROM table2 WHERE bedingung = 23)

Darauf deuten auch die Fundstellen in Bezug auf den Fehler hin, die Google mir geliefert hat.

Re: NULL Werte mit 0 ersetzen

Verfasst: Di, 24. Mär 2015 15:43
von satmax
Hallo Georg,

ja das Beispiel ist vollständig. Wenn in der DB nur ein NULL Wert ist funktioniert die Abfrage auch...

Re: NULL Werte mit 0 ersetzen

Verfasst: Mi, 25. Mär 2015 13:35
von georg
Hallo, Markus -


seltsam, denn die WHERE Bedingung sollte nur die Sätze durchlassen, bei denen das Feld NULL ist. Möglicherweise spinnt der Optimizer ...

Ich würde hier auf einen Fehler im SQL-Server tippen ...

Absurd (aber eventuell sicher) wäre die Alternative, das in einem Loop zu machen und den Update mit "LIMIT 1" zu begrenzen. Damit sollte dann immer nur ein Satz gelesen werden, und dann dürfte die Fehlersituation nicht mehr auftreten.

Re: NULL Werte mit 0 ersetzen

Verfasst: Mi, 25. Mär 2015 14:21
von satmax
Ja so geht es, hier meine (Test-)Lösung:

Code: Alles auswählen

DECLARE fzg CURSOR LOCAL FORWARD_ONLY
FOR
select Kuehljn 
from Fahrzeug where kuehljn is null
FOR UPDATE

OPEN fzg

DECLARE @kuehljn bit

FETCH NEXT FROM fzg INTO @kuehljn
PRINT @@FETCH_STATUS
WHILE @@FETCH_STATUS = 0
BEGIN
   print 'Update' 

   UPDATE Fahrzeug
   SET kuehljn = 0
   WHERE CURRENT OF fzg

	FETCH NEXT FROM fzg INTO @kuehljn, @GefGutJN
END

CLOSE fzg
DEALLOCATE fzg
Ich wollte halt eine einfache Lösung, am besten einen Einzeiler wie im ersten Beitrag dargestellt.

Re: NULL Werte mit 0 ersetzen

Verfasst: Mi, 25. Mär 2015 14:56
von Martin Altmann
Markus,
was spricht dagegen, alle Felder mit 0 zu füllen, die NULL oder 0 enthalten? Es gibt doch (soweit ich mich erinnere) einen Schalter, mit dem "" und NIL/NULL bei SQL al sgleichwertig interpretiert werden (vielleicht reicht Dir das ja auch aus, so dass Du Deinen Workaround(?) gar nicht mehr brauchst...)
Wenn da nichts gegen spricht, dann probiere doch mit empty() zu arbeiten - also:

Code: Alles auswählen

UPDATE myTable SET myField = 0 WHERE empty( myField )
Ich selber arbeite nicht mit Xbase++ in Verbindung mit SQL - insofern kann ich leider nicht mit dem genauen Schalter dienen...

Viele Grüße,
Martin

Re: NULL Werte mit 0 ersetzen

Verfasst: Mi, 25. Mär 2015 15:03
von satmax
Martin Altmann hat geschrieben:Markus,
was spricht dagegen, alle Felder mit 0 zu füllen, die NULL oder 0 enthalten?
Ja Martin, genau darum geht es mir ja. Ich möchte den Status jetzt:
Feld beinhaltet 0,1 oder NULL
ändern auf
Feld beinhaltet 0 oder 1 aber kein NULL

Also alle NULL Felder mit 0 updaten:

Code: Alles auswählen

UPDATE myTable SET myField = 0 WHERE myField IS NULL
nur so einfach geht das leider nicht.

Re: NULL Werte mit 0 ersetzen

Verfasst: Mi, 25. Mär 2015 15:10
von brandelh
Das Umsetzten allein reicht aber auch nicht, sonst werden neue weiterhin mit NULL erstellt.

Ich habe bei mir (MySQL) immer einen DEFAULT Wert eingetragen, '' bei Strings (das sind 2 x ' ) und 0 bei numerischen Werten.
Wenn du nun nachträglich deine Definition anpasst, werden dann die alten NULL gegen den default ausgetauscht ?

PS: was ist das oben für eine Sprache ? MS internes SQL Script ?

Re: NULL Werte mit 0 ersetzen

Verfasst: Mi, 25. Mär 2015 15:12
von georg
Hallo, Markus -


ALTER TABLE myTable COLUMN myField myField INT NOT NULL

(so geht's zumindest unter MySQL, dann werden zumindest bei neuen Sätzen keine NULL-Werte mehr produziert, da der Default für das Feld auf 0 gesetzt ist.) Je nach Server kann es passieren, dass der Server auch die Sätze auf 0 setzt, in denen aktuell noch NULL steht.

Re: NULL Werte mit 0 ersetzen

Verfasst: Mi, 25. Mär 2015 15:30
von satmax
brandelh hat geschrieben:Das Umsetzten allein reicht aber auch nicht, sonst werden neue weiterhin mit NULL erstellt.

Ich habe bei mir (MySQL) immer einen DEFAULT Wert eingetragen, '' bei Strings (das sind 2 x ' ) und 0 bei numerischen Werten.
Wenn du nun nachträglich deine Definition anpasst, werden dann die alten NULL gegen den default ausgetauscht ?

PS: was ist das oben für eine Sprache ? MS internes SQL Script ?
Ja, das ist mir klar, aber zuerst müssen die bestehenden Daten angepasst werden. Das ist T-SQL von MS. Nein, nachträglich wird nichts angepasst daher muss ich die Daten vorher manuell anpassen. Eine Möglichkeit wäre noch, eine neue Kopie der Struktur anzulegen, dort NULL verbieten, default auf 0 und dann alle Datensätze importieren. I

ch muss mir das noch überlegen. Es entstehen halt teilweise Probleme weil wir mit zwei völlig unterschiedlichen Programmiersprachen auf ein und der selbe SQL Datenbank arbeiten. Aber nichts was sich nicht lösen lässt, war halt ursprünglich nicht so gedacht.

Re: NULL Werte mit 0 ersetzen

Verfasst: Mi, 25. Mär 2015 16:30
von satmax
georg hat geschrieben:Hallo, Markus -

ALTER TABLE myTable COLUMN myField myField INT NOT NULL
Genau das verweigert mir der SQL Server weil eben bereits NULL Werte enthalten sind. Damit sind wir wieder beim ersten Posting. :wink:

Re: NULL Werte mit 0 ersetzen

Verfasst: Do, 26. Mär 2015 8:05
von satmax
Asche über mein Haupt. Folgende Zeile geht problemlos im SQL Server:

Code: Alles auswählen

UPDATE myTable SET myField = 0 WHERE myField IS NULL
Warum ging es bei mir nicht? Weil ein Datenbanktrigger den Fehler auslöste. Trigger angepasst und das Update funktioniert.

Re: NULL Werte mit 0 ersetzen

Verfasst: Do, 26. Mär 2015 16:22
von nightcrawler
In Standard-SQL könnte auch noch folgendes gehen:

Code: Alles auswählen

update mytable set myfield=coalesce(myfield,0)
Coalesce nimmt den ersten nicht-NULL-Parameter als Wert. Ist das Feld also ungleich NULL, wird der Feldwert wieder reingeschrieben, ansonsten der zweite Wert der Parameterliste (0).