NULL erstezen

Bitte am sofort an einem (!) Thread orientieren, wenn du weitere Fragen zu deinem Problem hast. Die Eröffnung zahlreicher neuer Threads in diesem Unterforum ist nicht erwünscht.
 
  • Gefällt mir
Reaktionen: Drexel, BeBur und Raijin
abcddcba schrieb:
Vom Exportieren nach XML hast du bisher nix erwähnt ...
Es geht sogar noch weiter.. Auf mich wirkt das wie ein riesiges XY-Problem.

Die Daten scheinen aus einer CSV zu stammen (Klick). Da die CSV offenbar unmodifiziert importiert wird (Klick) und die Tabellen nicht normiert sind (Klick), treten Probleme auf, die zu wilden Anpassungen der Datensätze innerhalb der Datenbank führen (Klick, Klick und Klick) und zwangsläufig Schwierigkeiten beim Abrufen und Ausgeben der Daten als XML zur Folge haben (Klick und Klick). Zu guter Letzt betrifft das auch noch über 1,3 Millionen Datensätze (Klick), was irgendwie nicht so recht auf ein privates Projekt hindeutet...


@LauraM : Ich meine das wirklich nicht böse, aber du machst es uns denkbar schwer, dir adäquat zu helfen. Mit jedem Thread, den du eröffnest und der wieder von einem neuen Problem handelt, das auf Fehlern basiert, die du bereits beim Grundkonzept gemacht hast, fragmentierst du die Infos zu deinem Gesamtvorhaben. Nicht ohne Grund wird in fast jedem deiner Threads danach gefragt ob es sich nu um MSSQL, MySQL, SQLite oder gar Excel handelt.
Hätte man konkrete Informationen über die Beschaffenheit der Daten, das Design der Datenbank, die Anwendungen, die mit diesen Daten arbeiten sollen und nicht zuletzt auch den Sinn und Zweck des Unterfangens, könnte man auch über d(ein)en Tellerrand der Threads hinausschauen und dir einen besseren Weg aufzeigen.


Bezüglich NULL-Werten habe ich dir oben ja bereits eine potentielle Lösung gepostet, durch das Design der Tabelle. Fügt man in eine Tabelle mit DEFAULT einen Datensatz ein, der keinen Eintrag zu einer Spalte enthält, wird der definierte Standardwert genommen, die Datenbank an dieser Stelle also beispielsweise mit leeren Strings anstelle von NULL befüllt. Ob das dein Problem final löst, ist aufgrund der fehlenden Infos schwierig zu sagen.
 
  • Gefällt mir
Reaktionen: xenon-seven, abcddcba, Oelepoeto und eine weitere Person
abcddcba schrieb:
Äh ja, sagte ich doch direkt im nächsten Absatz, Aufgabe des Client resp. View.


Vom Exportieren nach XML hast du bisher nix erwähnt ...
Hast du mal Docs versucht zu lesen:
https://docs.microsoft.com/en-us/sq...-the-elements-directive?view=sql-server-ver15

SQL:
SELECT * FROM Products
FOR XML RAW('customer'), ROOT('customers'), Elements XSINIL

Evtl hilft dir das?
Danke, xml konnte ich bauen und habe ich getan, allerdings wenn in Tabelle steht NULL, da kein Datensatz, steht das auch in Elementen in xml und das passt mir nicht. Deshalb habe ich euch gefragt, wie ich das NULL "löschen" kann.
Weisst du vielleicht, wie ich das für xml sagen kann, dass wenn NULL; dann bitte nicht eintragen. Nun muss ich so sagen, dass ich Abfrage aus 4 Tabellen mache, die Abfrage funktioniert auch, aber ich weiss es nicht was ich mit NULL machen kann.
 
Ist dir doch jetzt in mindestens 3 Beiträgen vorgekaut worden. Ggf. geht das natürlich auch da wo du das XML erstellst, mit dem jeweiligen Basic-Vorgehen.
 
WITH XMLNAMESPACES (
'temp.firma' as commons,
'zeitung' as v1)

select

from

FOR XML PATH('temp:zeitung'), ROOT('temp:zeitungen')

Wenn ich hier Abfrage starte, bekomme ich XML, aber wenn in der Tab steht irgendwo NULL- ist die NULL auch geliefert. Ich habe mit XSINIL Elements versucht, hat nicht funktioniert.
 
@LauraM : Du verschiebst deine Probleme immer weiter nach hinten. Fehler in der Datenquelle korrigierst du nach dem Import. Daten in falschen Spalten schiebst du wiederum danach durch die Gegend. Und statt die NULL-Werte bereits beim Befüllen der Tabelle zu eliminieren, willst du es wieder nachträglich wegmachen - besser gesagt sogar noch später beim Export. Du betreibst reine Symptombekämpfung, die Fehler sind aber bereits viel früher entstanden.



Wie dem auch sei, NULL-Werte in einer Tabelle kannst du wie folgt ersetzen (Achtung: bei diespalte= ist kein ", sondern zwei ' ):

SQL:
UPDATE dietabelle SET diespalte='' WHERE diespalte IS NULL

Jetzt sollte an jeder Stelle in der Tabellenspalte "diespalte" einfach ein leerer String anstelle von NULL stehen. Enthält "diespalte" einen anderen Datentyp, musst du die SET-Anweisung natürlich entsprechend auf einen passenden Standardwert anpassen.
 
Laura ohne Dir zu nahe zu treten, aber wenn das wirklich beruflich gedacht ist, dann muss ich wirklich schlucken.
Bei uns wäre das ein absolutes NOGO das jemand ohne wirkliche Kompetenz und Erfahrung an MYSQL Datenbanken rumfingert.

Das wäre bei uns eine Abmahnung bis Kündigung.
 
  • Gefällt mir
Reaktionen: BeBur
@LauraM , wenn es nur ob die Abfrage bzw. Darstellung geht einfach ISNULL(spalte,'') verwenden.
Die oben erwähnte Bedenken sind aber alle berechtigt und solltest Du dir Mal überlegen
 
Raijin schrieb:
@LauraM :Wie dem auch sei, NULL-Werte in einer Tabelle kannst du wie folgt ersetzen

Ob man das in der db machen will weiß ich nicht. Klar ist aber das dadurch unnötig db Platz verschwendet wird, wenn man bedenkt dass diese Aufgabe zyklisch durchgeführt wird und die altdaten in der db bleiben.

Muss aber der TE für sich entscheiden.
 
  • Gefällt mir
Reaktionen: Raijin
Klar, deswegen sag ich ja, dass die Fehler schon viel früher begangen wurden und sich nun immer weiter fortsetzen - reine Symptombekämpfung.
 
Prinzipiell kann man das schon so machen, die Raw Daten dumm 1:1 in die Datenbank schreiben, dann transformieren/korrigieren und dann ins produktive System schieben, Stichwort ETL Prozess.
Aber ich fürchte es mangelt hier an Lernbereitschaft.
 
  • Gefällt mir
Reaktionen: xenon-seven, Raijin und Oelepoeto
Drexel schrieb:
Stichwort ETL Prozess.
Naja, wenn man schon einen gesonderten ETL Prozess macht, dann würd ich gleich Datenbereinigung mitintegrieren, wenigstens eine rudimentäre.
 
  • Gefällt mir
Reaktionen: Raijin
ETL heißt ja nicht gleich, dass NULL-Werte unerwünscht sein. Gerade in große DB-Systeme sollte man sich damit einiges an Speicherplatz sparen.
 
  • Gefällt mir
Reaktionen: G-Red und Raijin
G-Red schrieb:
Naja, wenn man schon einen gesonderten ETL Prozess macht, dann würd ich gleich Datenbereinigung mitintegrieren, wenigstens eine rudimentäre.
Spricht ja nix dagegen, das fällt für mich alles in den Tranformationsteil. In der Datenbank würde ich die Null Werte auf jeden Fall auch drin lassen, in der XML Transformation kann man sie ja wie gewünscht ersetzen, wenn sie stören.
 
G-Red schrieb:
Naja, wenn man schon einen gesonderten ETL Prozess macht, dann würd ich gleich Datenbereinigung mitintegrieren, wenigstens eine rudimentäre.

In der Regel gibt es ja nicht "den" ETL Prozess. Es sollten schon mehrschichtige Prozesse mit klaren Aufgaben sein.
 
parats schrieb:
In der Regel gibt es ja nicht "den" ETL Prozess. Es sollten schon mehrschichtige Prozesse mit klaren Aufgaben sein.
War jetzt auch nicht von DEM Prozess die Rede, sondern allgemein.
 
Raijin schrieb:
@LauraM : Du verschiebst deine Probleme immer weiter nach hinten. Fehler in der Datenquelle korrigierst du nach dem Import. Daten in falschen Spalten schiebst du wiederum danach durch die Gegend. Und statt die NULL-Werte bereits beim Befüllen der Tabelle zu eliminieren, willst du es wieder nachträglich wegmachen - besser gesagt sogar noch später beim Export. Du betreibst reine Symptombekämpfung, die Fehler sind aber bereits viel früher entstanden.



Wie dem auch sei, NULL-Werte in einer Tabelle kannst du wie folgt ersetzen (Achtung: bei diespalte= ist kein ", sondern zwei ' ):

SQL:
UPDATE dietabelle SET diespalte='' WHERE diespalte IS NULL

Jetzt sollte an jeder Stelle in der Tabellenspalte "diespalte" einfach ein leerer String anstelle von NULL stehen. Enthält "diespalte" einen anderen Datentyp, musst du die SET-Anweisung natürlich entsprechend auf einen passenden Standardwert anpassen.
Hi, ich habe das so gemacht
Code:
UPDATE tab1 SET spalte1='' WHERE spalte1 ='null'

Allerdings wnn ich jetzt xml aufbaue, dann die Tagselemente sind trotzdem gezeigt, allerdings ohne Inhalt.
Wie kann ich die Tagselemnte, die kein Inhalt haben- nicht anzeigen lassen?

Ich habe Leerzeichen in die leere Felder eingetragen, aber es funktioniert nicht. Die leere Elemente werden trotzdem erzeugt.
 
Zuletzt bearbeitet:
WHERE spalte1 IS NULL und WHERE spalte1 = 'null' sind zwei ganz verschiedene Sachen. Im ersten Fall hat die Spalte KEINEN Wert, im zweiten Fall hat die Spalte den Wert 'null'. Lies dich Mal ein, das ist ganz wichtig zu verstehen!
 
  • Gefällt mir
Reaktionen: Raijin
Genau deswegen sind deine mittlerweile 12 Threads, die alle immer nur einen Bruchteil des Problems enthalten, absolut kontraproduktiv, weil du immer nur nach Insellösungen fragst "Wie krieg ich NULL weg?" "Wie kann ich das machen" "Wie kann ich jenes machen". Das große Ganze fehlt nach wie vor, mit handfesten Beispieldaten, die nicht über alle 12 Threads verteilt sind. So könnte man nämlich womöglich sogar dein Szenario nachbauen und nachvollziehen. Dann liest du die Antworten offenbar nicht präzise genug, weil dir das Grundverständnis fehlt.

Natürlich werden in einem banalen SELECT auch leere (im Sinne von leerer String oder ='null') Felder ausgegeben, das sind ja legitime Werte. Dem Interpreter ist es vollkommen egal was in dem String drinsteht. Ein leerer String mit der Länge 0 ( '' ) ist für den Interpreter nichts anderes als ein String mit 25 Zeichen wie 'Hallo ich bin ein String!' NULL wiederum ist KEIN WERT.

Ich rate dir jetzt ein letztes Mal, dass du dein Konzept überdenken musst. Du nutzt das falsche Werkzeug und wendest es zudem auch noch falsch an, weil dir die absoluten Basiskenntnisse fehlen.

  • bringe deine Daten vor dem Import in die Datenbank in ein passendes Format
  • strukturiere deine Tabellen nach den Prinzipien relationaler Datenbanken
  • normiere deine Tabellen
  • verwende die Datenbank als Datenspeicher
  • verwende eine externe Anwendung als Datenverarbeitung

Als externe Anwendung geht vermutlich sogar so etwas banales wie PowerShell, ist bei Windows dabei. Da kannst du deine SELECTs mit JOINs abrufen, jeden Datensatz in einer Schleife individuell programmatisch auf etwaige NULL-Felder prüfen, um daraus anschließend ein XML-Dokument zu basteln. Es ist kein Argument zu sagen, dass du nicht programmieren kannst, weil du SQL offensichtlich auch nicht beherrschst.

Da ich aber nicht erwarte, dass du zur Besinnung kommst und ich noch nicht mal auf die Idee kommen würde, direkt aus SQL eine XML-Datei zu generieren, und es stattdessen wie beschrieben über zB C#, o.ä. lösen würde, kann ich dir bei diesem speziellen Problem nicht helfen. Hätte ich bereits einen XML-Output - mal ungeachtet der Quelle- und würde unerwünschte Felder löschen wollen, würde ich vermutlich einfach die XML-Datei mit einem Editor bearbeiten und alle Vorkommen von <bla></bla> rauslöschen.
Quick and Dirty und auch nur bei einmaliger Anwendung sinnvoll, aber eine rudimentäre Möglichkeit, den XML-Export im Nachhinein noch etwas zu modifizieren. Da es aber um über 1 Million Datensätze geht und mir das Vorstellungsvermögen fehlt, dies mit einem privaten Hobbyprojekt zu verknüpfen, bekomme ich zunehmend Bauchschmerzen dabei. Ich hoffe inständig, dass da kein Produktivsystem hinterhängt, deine Import-/Rumgeschiebe-/Export-Aktionen lediglich der einmaligen Umwandlung der Daten dient und am Ende kein zahlender Kunde dahintersteht. Handelt es sich doch um ein Produktivsystem, ist es grob fahrlässig, dies von jemandem ohne nennenswerte Grundkenntnisse - weder in einer Programmiersprache noch in SQL - durchführen zu lassen...


*edit
'' vs NULL kann man sich übrigens so vorstellen:

'', der leere String ist wie diese vermeintlichen Fernseher bei IKEA. Es sieht aus wie ein Fernseher, man kann die Tasten drücken, aber nix passiert, weil das nur ein leerer Fernseher ist, ein Gehäuse, der Container für den eigentlichen Fernseher, eben nur die beiden ' am Anfang und am Ende, aber nix dazwischen, kein Inhalt.

Bei NULL wiederum steht da nicht mal der leere Fernseher, sondern gar nichts. Das TV-Board ist leer, kein Gehäuse-TV, keine Tasten, man greift ins buchstäbliche NICHTS.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Myron und Drexel
Zurück
Oben