NULL Werte mit 0 ersetzen

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

NULL Werte mit 0 ersetzen

Beitrag 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?
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: NULL Werte mit 0 ersetzen

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: NULL Werte mit 0 ersetzen

Beitrag von satmax »

Hallo Georg,

ja das Beispiel ist vollständig. Wenn in der DB nur ein NULL Wert ist funktioniert die Abfrage auch...
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: NULL Werte mit 0 ersetzen

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: NULL Werte mit 0 ersetzen

Beitrag 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.
Gruß
Markus
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: NULL Werte mit 0 ersetzen

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: NULL Werte mit 0 ersetzen

Beitrag 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.
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: NULL Werte mit 0 ersetzen

Beitrag 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 ?
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: NULL Werte mit 0 ersetzen

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: NULL Werte mit 0 ersetzen

Beitrag 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.
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: NULL Werte mit 0 ersetzen

Beitrag 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:
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: NULL Werte mit 0 ersetzen

Beitrag 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.
Gruß
Markus
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: NULL Werte mit 0 ersetzen

Beitrag 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).
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Antworten