„Jeder [SQL] Datentyp beinhaltet einen speziellen Wert, genannt der Null-Wert,“0 „der genutzt wird, um das Fehlen eines Datenwertes anzuzeigen“.1 Show
Der 2-Wert zeigt nicht an, warum ein Wert fehlt – er markiert bloß Stellen, für die es keinen Wert gibt. SQL selbst verwendet den 2-Wert unter anderem im Ergebnis eines outer joins.2 Obwohl es Ausnahmen gibt,3 kann man im Allgemeinen nicht sagen, warum ein Wert 2 ist.Benutzer können den 2-Wert für beliebige Zwecke einsetzen. Die vermutlich häufigste Anwendung ist, optionale Attribute ohne zusätzlicher Tabelle umzusetzen. Die Fehlerbehandlung ist ein anderer, wichtiger Anwendungsfall: anders als bei anderen Programmiersprachen verursacht die Verarbeitung von 2-Werten in SQL keinen Fehler oder Abbruch – 2-Werte propagieren einfach durch Ausdrücke hindurch.Inhalt:
Vergleiche mit <Ausdruck> is null2Vergleiche ( 2, 3, 4, …) mit 2 liefern weder true (wahr) noch false (falsch) sondern den dritten logischen Wert von SQL: unknown (unbekannt). Da die 6-Klausel unknown wie false behandelt, entfernt sie im folgenden Beispiel alle Zeilen – selbst jene, bei denen 7 tatsächlich 2 ist.
WarnungDie SQL Server-Einstellung 9 ändert dieses Verhalten.Auf <Ausdruck> is null2 testen: NULLIF(<Ausdruck>, <Ausdruck>)1Das SQL-Prädikat 1 testet, ob der Wert eines Ausdruckes 2 oder nicht 2 ist.
Dieses Beispiel liefert true, wenn der Wert des Ausdruckes 2 ist oder false, wenn nicht. Das optionale 6 negiert das Ergebnis.<Ausdruck> is null2-sicherer Vergleich: NULLIF(<Ausdruck>, <Ausdruck>)8SQL kennt zwei unterschiedliche Kriterien, um zu bestimmen ob zwei Werte „gleich“ sind: Gleichheit ( 4) und Unterscheidbarkeit (distinct). Der Unterschied ist, dass das beim Gleichheitszeichen (=) vergleiche mit 2 unentscheidbar sind – daher liefert 1 als Ergebnis unknown. Bei einem Test auf Unterscheidbarkeit werden 2-Werte aber wie normale Werte behandelt. Daher sind zwei 2-Werte ununterscheidbar („gleich“), während ein nicht- 2-Wert von einem 2-wert sehr wohl unterscheidbar ist.Ursprünglich wurde das Unterscheidbarkeitskriterium im SQL-Standard nur intern genutzt, um das Verhalten von 6, 7, 8 und dergleichen zu definieren. SQL:1999 und SQL:2003 haben dann das 9-Prädikat eingeführt, damit der Test auf Unterscheidbarkeit auch von SQL-Programmieren genutzt werden kann.
Das 9-Prädikat ist ein optionales Feature, das nicht von allen Datenbanken unterstützt wird. Siehe „ 1-sichere Vergleiche: 9“ für Alternativen.<Ausdruck> is null2 in nicht-<Ausdruck> is null2 Werte wandeln und umgekehrtManchmal ist es nötig, einen speziellen Wert durch den 2-Wert zu ersetzen oder umgekehrt, 2 durch einen anderen Wert zu ersetzen. Der 7-Ausdruck bietet dafür sogar zwei Kurzformen an.1 + NULL8 — <Ausdruck> is null2 durch einen anderen Wert ersetzenSQL’s 0 ersetzt 2 durch einen anderen Wert.
Das Beispiel liefert den Wert des Ausdrucks, außer es ist der 2-Wert. Dann ist das Ergebnis die Zahl 3. 8 akzeptiert beliebig viele Argumente und liefert den ersten nicht- 2-Wert oder 2, wenn alle Argumente 2 sind.'foo ' || NULL || 'bar'8 — Einen einzelnen Wert durch <Ausdruck> is null2 ersetzenSQL’s 8 ersetzt einen einzelnen Wert durch 2. Wenn die beiden Argumente gleich sind ( 4), ist das Ergebnis von 8 2. Andernfalls wird das erste Argument als Ergebnis geliefert.
1 + NULL7 — Mehrere Werte durch <Ausdruck> is null2 ersetzenMit dem allgemeinen 7-Ausdruck kann man natürlich andere Fälle abdecken – z. B. mehrere Werte in einem Schritt durch 2 ersetzen:
Natürlich kann man im 7-Ausdruck auch andere Vergleiche durchführen: 3, 2, 2 und so weiter.<Ausdruck> is null2 breitet sich durch Ausdrücke ausAusdrücke und Funktionen, die einen 2-Wert verarbeiten, liefern grundsätzlich 2 als Ergebnis.4 Nennenswerte Ausnahmen sind Aggegatfunktionen und – aufgrund der dreiwertigen Logik von SQL – zwei logische Operationen.5Das Ergebnis der folgenden Ausdrücke ist daher immer 2:
Abweichungen: Oracle und SQL Server DatenbankenDie Oracle-Datenbank behandelt den Leerstring wie 2 und umgekehrt. Einerseits ist 8 true, andererseits wird 2 beim Zusammenfügen von Zeichenketten ( 00) wie ein Leerstring behandelt. Das Ergebnis des zweiten Beispiels ist bei der Oracle-Datenbank daher 01.SQL Server bietet die überholte (deprecated) Einstellung 02 an, um 2 beim Zusammenfügen von Zeichenketten mittels 04 wie einen Leerstring zu behandeln. Beachte: die Funktion 05 behandelt 2 immer als Leerstring.Hinweis: Proprietäre FunktionenDie meisten Datenbanken unterstützten mehr Funktionen als vom SQL-Standard definiert. Diese Funktionen müssen nicht unbedingt der Idee folgen, dass sich 2 ausbreitet.Die Funktion 08 zum zusammenfügen von Strings ist ein wichtiges Beispiel, weil sie von sehr vielen Datenbanken angeboten wird. Die Behandlung von 2 in den Eingangsdaten ist jedoch unterschiedlich: Db2, MySQL und MariaDB handeln im Sinne des SQL-Standard und liefern 2 als Ergebnis. H2, Oracle, PostgreSQL und SQL Server behandeln 2 in 08 wie einen Leerstring.In logischen Ausdrücken ( 13, 14, 6) ist 2 gleichbedeutend mit unknown.6 2 (unknown) pflanzt sich nur durch logische Ausdrücke fort, wenn das Ergebnis durch einen 2-Wert unentscheidbar wird. Daher gibt es zwei Fälle, bei denen das Ergebnis trotz eines 2-Operanden nicht 2 ist: 21 ist false, weil die logische Konjunktion ( 13) false ist, sobald ein Argument false ist. Analog liefert 23 das Ergebnis true.<Ausdruck> is null2 in Aggregatfunktionen (count, sum, …)Grundsätzlich entfernen Aggregatfunktionen 2-Werte aus der Eingangsmenge bevor sie die Aggregierung durchführen.7 Das bedeutet, dass das Ergebnis einer Aggregatfunktion durch einen 2-Wert nicht automatisch 2 wird. Dieses Verhalten wird oft zur Umsetzung von Pivot-Abfragen genutzt.DenksportWie wirkt sich die Ausbreitung des 2-Wertes durch Ausdrücke und das Entfernen von 2-Werten vor der Aggregation auf die folgenden Ausdrücke aus:
Das Ergebnis einer Aggregatfunktion ist nur 2, wenn eine effektiv leere Eingangsmenge vorliegt. Das ist der Fall, wenn (1) alle Zeilen vor der Aggregierung entfernt werden (z. B. aufgrund einer 31-Klausel oder weil es 2-Werte sind), oder (2) ein explizites oder implizites 33 auf einer tatsächlich leeren Menge durchgeführt wird.8 34 und 35 liefern niemals 2. Bei einer effektiv leeren Eingangsmenge liefern diese Funktionen den numerischen Wert 3.9Hinweis in eigener SacheIch lebe von SQL-Schulungen, SQL-Tuning und Beratung sowie dem Verkauf meines Buches „SQL Performance Explained“. Mehr auf winand.at. Aggregatfunktionen, die strukturierte Daten liefern ( 38, 39, 40), entfernen 2-Werte nicht.10 Im Gegensatz zu 39 verwendet 43 die Standardeinstellung 44 und entfernt daher 2-Werte.11 Die meisten Produkte verwenden 46 als Standardeinstellung für 43.<Ausdruck> is null2 in <Ausdruck1> IS NOT DISTINCT FROM <Ausdruck2>4, <Ausdruck1> IS NOT DISTINCT FROM <Ausdruck2>5, <Ausdruck1> IS NOT DISTINCT FROM <Ausdruck2>6, <Ausdruck1> IS NOT DISTINCT FROM <Ausdruck2>7, …Gruppierungen werden aufgrund des Unterscheidbarkeitskriteriums 8 durchgeführt.12 Daher werden alle 2-Werte in eine Gruppe zusammengefasst.Das betrifft auch andere Operationen, die auf Basis einer Gruppierung definiert sind: 55 (in 56 und Aggregatfunktionen), 57, 58 (ohne 59), ….13<Ausdruck> is null2 in <Ausdruck1> IS NOT DISTINCT FROM <Ausdruck2>9Der SQL Standard überlässt die Sortierung von 2-Werte relativ zu nicht- 2-Werten den Herstellern:14 2-Werte können entweder vor, oder nach den nicht- 2-Werten einsortiert werden (siehe Kompatibilität).SQL:2003 hat den 66-Zusatz 67 eingeführt, damit SQL-Entwickler die Sortierung von 2-Werten steuern können. Dieser Zusatz wird derzeit nur von wenigen Datenbanken unterstützt (siehe Kompatibilität). 0Der Effekt von 67 kann mit einem 7-Ausdruck jedoch in allen Datenbanken erreicht werden. Das folgende Beispiel setzt 71 auf diese Weise um: 1Beachte, dass der 7-Ausdruck einen neuen Sortierschlüssel definiert, der nur dazu dient, die 2- von den nicht- 2-Werten zu trennen.<Ausdruck> is null2 in Unique ConstraintsIn Unique-Constraints ist der 2-Wert ungleich allem – d. h. ungleich 2 und ungleich anderen Werten.15 Da dadurch jede 2 eine andere 2 ist, akzeptieren Uniuqe-Constraints mehrere 2-Werte.Zukunftsmusik: <Ausdruck> is null81Ein Entwurf zum nächsten SQL-Standard führt den 82-Zusatz ein um den Umgang von 2-Werten in Unique-Constraints steuern zu können. Entgegen SQL:2016 ist das Default-Verhalten dann von der Implementierung definiert. Weiters ist es auch bei 84 erlaubt, mehrere 2-Werte im Unqiue-Constraint zu akzeptieren, wenn alle Spalten des Constratins den 2-Wert beinhalten.BigQueryaaDb2 (LUW)aaMariaDBMySQLOracle DBbcPostgreSQLSQL ServerSQLitedefault:nulls distinctdefault:nulls not distinct
Kompatibilität 2 ist von Anfang an Teil des SQL-Standards. Unique-Constraints auf Spalten mit 2-Werten wurde von intermediate SQL-92 gefordert. Seit SQL:1999 ist das ein optionales Feature (T591).Die explizite Sortierung von 2-Werten ( 67) wurde mit SQL:2003 als Teil des optionalen Features T611, “Elementary OLAP operations”, eingeführt. |