Ist es ANSI konform, wenn
eines der Felder einen Null Wert hat, „Kontakt“ auch einen
Nullwert erhält?
Das ist nicht nur ANSI-konform, es ist auch das, was logischerweise herauskommen sollte. Mit NULL läßt sich nicht rechnen, auch nicht konkatenieren.
Als Eselsbrücke: NULL hat die semantische Bedeutung „unbekannt“ - es ist nicht ein leeres Feld, es ist nicht nichts, es ist nicht 0, es ist schlicht unbekannt. Wenn du aus mehreren Feldern etwas erstellst und eines dieser Felder unbekannten Inhalts ist, dann wird das Ergebnis immer unbekannt sein.
Das ist der Hammer- eben habe ich das auch ausprobiert. Es stimmt tatsächlich! Welche Version verwendest du? In der 9.2.0.1.0 klappt es; jedoch weiß ich von früheren Versionen, daß man dort immer NVL verwenden mußte.
Wenn man’s weiss… logisch begründen liesse es sich auch,
obwohl ich die ANSI-Variante schlüssiger finde.
Ich vermute, hier hat Oracle die Funktion des Konkatenations-Operators verändert - werde mal ein bißchen im Netz stöbern.
Was sagt eigentlich ANSI zu dem hier:
INSERT INTO my_table
VALUES (’’);
Das wäre ja eigentlich NICHT mit NULL zu füllen, weil ich ja
explizit die leere Zeichenkette reinschreibe und nicht etwa
nichts/undefiniert.
Das ist eine der grundlegenden Probleme bei allen mir bekannten Datenbanken. Sie inserten NULL, obwohl sie eigentlich eine leere Zeichenkette reinsetzen sollten. Wenn du mit anderen Hochsprachen arbeitest, z.B. C oder C++, mußt du dies explizit abfragen, da diese die Unterscheidung sehr wohl können
Wenn ich mich recht entsinne, stand das aber früher in den Handbüchern drin… auch hier muß ich mal wieder lesen.
Das ist der Hammer- eben habe ich das auch ausprobiert. Es
stimmt tatsächlich! Welche Version verwendest du? In der
9.2.0.1.0 klappt es; jedoch weiß ich von früheren Versionen,
daß man dort immer NVL verwenden mußte.
bei varchar2 kannst du die nulls dranfügen, wie du willst (kommen oft „lustige“ sachen beim konkatinieren raus, a la "select anrede||’,’||vorname||’ ‚||nachname||‘,’||strasse||’,’||wasweissich …’ from adressen, anreden, … -> „Herr Tomh,1110 Wien“ und so … und das ist schon sehr, sehr lange so (zumindest ab 7.2.2); in meiner umgebung wird das ganze null-string genannt …
bei numerischen algorithmen gibt es bei einem null immer null (null+1=null, sum(bla) = null, …), ein hoch auf das nvl(allerdings wäre es für das copy-paste einfacher, den default-wert vorne anzugeben
Wenn ich mich recht entsinne, stand das aber früher in den
Handbüchern drin… auch hier muß ich mal wieder lesen.
haben wir alle beim letzten groß-rein-machen weggeschmissen - bis wir draufkamen, daß in einem hintersten kasten von version6 alle bücher nochmals vorhanden waren …
Das wäre ja eigentlich NICHT mit NULL zu füllen, weil ich ja
explizit die leere Zeichenkette reinschreibe und nicht etwa
nichts/undefiniert.
Das ist eine der grundlegenden Probleme bei allen mir
bekannten Datenbanken. Sie inserten NULL, obwohl sie
eigentlich eine leere Zeichenkette reinsetzen sollten. Wenn du
mit anderen Hochsprachen arbeitest, z.B. C oder C++, mußt du
dies explizit abfragen, da diese die Unterscheidung sehr wohl
können
Ähm, das beantwortet leider nicht meine Frage, was denn ANSI dazu meint. Ich selbst hab’ leider keinen SQL92 hier rumliegen (vor allem, weil sich Oracle da eh nicht mit Konformitätsruhmesblättern bedeckt )
Und zu C/C++: Bei C gebe ich dir noch recht (char *my_string = „“ vs. char *my_string = NULL), aber in C++ werden gemeinhin eigene Stringklassen verwendet (CString my_string("") vs. CString my_string(???)). Inwiefern siehst du da die Möglichkeit einen String auf nicht initialisiert zu setzen? Meine Lieblingsbibliothek Tools.h++ kennt das jedenfalls nicht wirklich (die kennt zwar einen NULLString, aber der ist eben der Leerstring).
Ähm, das beantwortet leider nicht meine Frage, was denn ANSI
dazu meint. Ich selbst hab’ leider keinen SQL92 hier rumliegen
(vor allem, weil sich Oracle da eh nicht mit
Konformitätsruhmesblättern bedeckt )
Ich suche in meinen seinerzeitigen Lernunterlagen, hab aber noch nichts gefunden… ich muß kleinlaut zugeben, daß ich meine Behauptung erst mal nicht belegen kann. Aber ich bleibe dran!
Und zu C/C++: Bei C gebe ich dir noch recht (char *my_string =
„“ vs. char *my_string = NULL), aber in C++ werden gemeinhin
eigene Stringklassen verwendet (CString my_string("") vs.
CString my_string(???)). Inwiefern siehst du da die
Möglichkeit einen String auf nicht initialisiert zu setzen?