Transact SQL und Null

Hallo zusammen

Ist es ANSI konform oder eine Transact SQL (SQL Server 2000) Spezialität, dass wenn in diesem Konstrukt:

tab_testLASTNAME + ', ’ + tab_testPREFIX + ’ ’ + tab_testFIRSTNAME + ’ ’ + tab_testMIDDLENAME AS Kontakt

eines der Felder einen Null Wert hat, „Kontakt“ auch einen Nullwert erhält?

vielen Dank und Grüsse
Peter

ist ANSI

du musst die NULL konvertieren. Oracle macht das mit NVL(feld,ersatz).
Was SQL Server macht weiss ich nicht.

Gruß

Peter

Mahlzeit,

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.

Gruß

Sancho

Danke Sancho…

Das deckt sich mit meinen Überlegungen - a la codd -
Grüsse Peter

Hallo zusammen!

Wieder schlauer geworden, und auch hier wieder einmal ein Beweis, dass Oracle mit ANSI nicht allzuviel am Hut hat:

SELECT 'a'||null||'b' result FROM dual;
RE
--
ab

Wenn man’s weiss… logisch begründen liesse es sich auch, obwohl ich die ANSI-Variante schlüssiger finde.

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.

Neugierige Grüße,
Martin

Mahlzeit!

SELECT 'a'||null||'b' result FROM dual;
RE
--
ab

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 :frowning:

Wenn ich mich recht entsinne, stand das aber früher in den Handbüchern drin… auch hier muß ich mal wieder lesen.

Gruß

Sancho

Mahlzeit!

Morgen!

SELECT ‚a‘||null||‚b‘ result FROM dual;
RE

ab

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 :wink:

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 …

grüße,
tomh

Hallo Sancho!

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 :frowning:

Ä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 :wink:)
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).

Lieb Grüße
Martin

Mahlzeit!

Ä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 :wink:)

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?

Stimmt, ich bezog mich auf C.

Gruß

Sancho