Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Umgang mit NULL-Werten in SQL Server

Was ist NULL? NULL oder die NULL-Markierung ist die Art und Weise, wie wir einen unbekannten Wert in SQL darstellen, mit SQL beziehe ich mich auf die standardmäßige strukturierte Abfragesprache, nicht auf MS SQL Server. Der letzte Satz führt uns ein wenig zurück ins Jahr 1969, als der Standard erstmals von Dr. E. F. Codd definiert wurde. NULL wird notwendig, weil wir in Begriffen der sogenannten dreiwertigen Prädikatenlogik denken müssen. Ein Prädikat ist die Eigenschaft eines Ausdrucks, die entweder gilt oder nicht gilt. Zum Nennwert würde man an zwei Möglichkeiten denken:WAHR oder FALSCH. Es gibt jedoch noch eine dritte Möglichkeit:UNBEKANNT.

Nehmen wir ein Beispiel. Angenommen, ein Attribut (Spalte) in unserer Beziehung (Tabelle) repräsentiert die Steueridentifikationsnummer (TIN) einer Gruppe von Kleinunternehmern in Accra, Ghana. Die Spalte für den Datensatz jedes Geschäftsinhabers wird mit seiner/ihrer TIN ausgefüllt, und wir können diese Spalte verwenden, um ein anderes Attribut zu bestimmen, z. B. ob er/sie in Bezug auf Steuerzahlungen auf dem neuesten Stand ist. In diesem Anwendungsfall gibt es jedoch zwei zusätzliche Möglichkeiten:

  1. Die Unabhängige Stylistin hat eine TIN und ist aktuell.
  2. Der Geschäftsinhaber hat keine TIN und ist (offensichtlich) nicht auf dem neuesten Stand.

Das Obige beschreibt, was Dr. Codd vierwertige Prädikatenlogik nannte. Der SQL-Standard vereinfacht diese beiden zusätzlichen Bedingungen jedoch, indem er sie als unbekannt, dh NULL, definiert. Wir kennen die TIN des Geschäftsinhabers nicht und können keinen anderen Wert aus dem Attribut des betroffenen Geschäftsinhabers ermitteln. NULL ist also UNBEKANNT und der dritte Wert in der standardmäßigen dreiwertigen Prädikatenlogik.

NULL ist etwas Besonderes

Die Definition von NULL erfordert eine andere Behandlung des Markers als bei tatsächlichen Werten. Im Folgenden finden Sie Beispiele:

  1. Es gibt keinen Filter „WHERE =NULL;“. Der korrekte Ausdruck wäre „WHERE IS NULL;“. Dasselbe gilt für den umgekehrten Ausdruck.
  2. Beim Sortieren in aufsteigender SQL-Reihenfolge können Sie NULL-Werte zuerst oder zuletzt auflisten. Standardmäßig werden NULLen zuerst aufgelistet.
  3. NULL-Werte können nicht verglichen werden. Dies sollte offensichtlich sein, da wir gesagt haben, dass NULL UNBEKANNT ist.
  4. Wenn ein Verkettungsversuch eine NULL-Spalte beinhaltet, ist das Ergebnis NULL.

Allgemeine NULL-bezogene Funktionen

Im Folgenden finden Sie drei allgemeine NULL-bezogene Funktionen in SQL Server

ISNULL

ISNULL – Ersetzt NULL durch einen angegebenen Ersatzwert. Listing 1 und Abb. 1 zeigen einfache Beispiele für ISNULL.

-- Listing 1: Simple Example of ISSNULL
SELECT ISNULL (NULL, 3) NULLREPLACEMENT;
SELECT ISNULL (NULL,'GREEN') NULLREPLACEMENT;
SELECT ISNULL (NULL,'2018-12-25') NULLREPLACEMENT;

Abb. 1:Einfaches Beispiel für ISNULL

NULLIF

NULLIF gibt NULL zurück, wenn der Wert der beiden Argumente gleich ist.

-- Listing 2: Simple Example of NULLIF
SELECT NULLIF(3,3) AS NULLIFF;
SELECT NULLIF(3,5) AS NULLIFF;
SELECT NULLIF('RED','RED') AS NULLIFF;
SELECT NULLIF('GREEN','RED') AS NULLIFF;

Abb. 2:Einfaches Beispiel für NULLIF

VEREINIGUNG

COALESCE gibt den ersten Nicht-NULL-Wert aus der bereitgestellten Liste zurück. Listing 1 zeigt Beispiele dafür und Abb. 1 zeigt die Ausgabe der Abfragen.

-- Listing 3: Simple Example of COALESCE
SELECT COALESCE (NULL,'','GREEN','','') AS NULLRESPONSE;
SELECT COALESCE (NULL,'GREEN','HOPE','') AS NULLRESPONSE;
SELECT COALESCE (1,'','GREEN','','') AS NULLRESPONSE;

Abb. 3:Einfaches Beispiel für Coalesce

Beachten Sie, dass diese einfachen Beispiele die Natur von NULL verwenden. NULL und Leerzeichen sind NICHT dasselbe. In der ersten Anweisung gibt COALESCE ein Leerzeichen zurück, das uns zeigt, dass ein Leerzeichen der erste Nicht-NULL-Wert in der Liste ist.

Unterschiede zwischen ISNULL und COALESCE

Die Unterschiede zwischen ISNULL und COALESCE waren Gegenstand mehrerer Online-Artikel sowie Bücher, wie z. B. der im Abschnitt „Referenzen“ aufgeführten. Diese Unterschiede werden wie folgt zusammengefasst:

  1. ISNULL ist Eigentum von SQL Server, während COALESCE eine ANSI-Standardfunktion ist. Dies impliziert, dass COALESCE aus Gründen der Portabilität bevorzugt wird.
  2. ISNULL nimmt nur zwei Argumente, während COALESCE mehr als zwei Argumente annehmen kann.
  3. Der Datentyp des von ISNULL zurückgegebenen Werts wird durch den Datentyp des ersten Arguments bestimmt, während der Datentyp des von COALESCE zurückgegebenen Werts durch den Datentyp in der Liste mit dem höchsten Vorrang bestimmt wird.
  4. Wenn beide Funktionen mit Unterabfragen verwendet werden, schneidet ISNULL besser ab, da COALESCE intern in einen CASE-Ausdruck übersetzt wird, wodurch es dazu neigt, Scans zu wiederholen.

Itzik Ben-Gan untersucht in seinem Artikel, auf den am Ende dieses Artikels verwiesen wird, auch andere Implikationen der Umwandlung von COALESCE in einen Fallausdruck.

Anwendungsbeispiele

Wir möchten die Liste der Kunden basierend auf bestimmten Kriterien aus der Tabelle, die wir in Listing 4 erstellen, auf einem Webportal anzeigen. Die Aufgaben 1 und 2 geben mögliche Anforderungen an und wir verwenden ISNULL und COALESCE, um die Anforderungen zu erfüllen.

--Listing 4: Table Creation Script
CREATE TABLE CUSTOMER 
(ID INT IDENTITY (1,1)
,FIRSTNAME VARCHAR(50)
,LASTNAME VARCHAR(50)
,SEX CHAR(1)
,ADDRESS VARCHAR(300)
,FIRSTTRANDATE DATETIME
,PHONENUMBER1 BIGINT
,PHONENUMBER2 BIGINT
,PHONENUMBER3 BIGINT);
GO

INSERT INTO CUSTOMER VALUES ('KENNETH','IGIRI','M','ACCRA, GHANA',GETDATE(),'0245335678','0555335678',NULL);
INSERT INTO CUSTOMER VALUES ('RICHARD','HANO','M','BUDAPEST, HUNGARY',GETDATE(),'889189400122',NULL,NULL);
INSERT INTO CUSTOMER VALUES ('GEORGINA','APPIAH','F','ACCRA, GHANA','09-16-2018','02456665678','0275339678',NULL);
INSERT INTO CUSTOMER VALUES ('HOWARD','KLEVIA',NULL,'HAGUE, SWITZERLAND','02-16-2017','3499285782',NULL,NULL);
INSERT INTO CUSTOMER VALUES ('ZEN','GREGOR',NULL,'SHANGHAI, CHINA','06-23-2018','0245335678','0555335678',NULL);
INSERT INTO CUSTOMER VALUES ('IHEOMA','AWA','F','LAGOS, NIGERIA',GETDATE(),'0245335678','0555335678',NULL);

Abb. 4 Beispieltabelle

Aufgabe 1 :Gibt die Liste aller Kunden zurück, die keine alternative Telefonnummer angegeben haben.

--Listing 5: Table List of Customers with no Secondary Phones
--A: The Simple Answer
SELECT * FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;

--B: Presenting the Result Set Better
SELECT 
FIRSTNAME
,LASTNAME
,ADDRESS
,FIRSTTRANDATE
,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
,ISNULL(CAST(PHONENUMBER2 AS VARCHAR), 'NO SECONDARY PHONE') AS [SECONDARY PHONE NUMBER]
FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;

Mit COALESCE (oder ISNULL) können wir die erforderlichen Informationen viel besser darstellen, indem wir einen Text mit der Aufschrift „Kein zweites Telefon“ verwenden.

Abb. 5 Ergebnissatz für Listing 5

Aufgabe 2 :Zurückgeben der Liste aller Kunden, ihrer primären Telefonnummer, und jede andere alternative Telefonnummer.

--Listing 6: Table List of Customers with an Other Alternate Number
SELECT 
FIRSTNAME
,LASTNAME
,ADDRESS
,FIRSTTRANDATE
,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
,COALESCE(CAST(PHONENUMBER2 AS VARCHAR),CAST(PHONENUMBER3 AS VARCHAR), 'NO OTHER PHONE') AS [OTHER PHONE NUMBER]
FROM CUSTOMER  ;

Abb. 6 Ergebnismenge für Listing 6

In diesem Fall ist ISNULL keine Option, da wir drei Argumente übergeben.

Schlussfolgerung

In diesem Artikel haben wir das Konzept von NULL in Bezug auf die dreiwertige Prädikatenlogik besprochen und beliebte Funktionen beschrieben, die wir in SQL Server verwenden, um mit Datensätzen umzugehen, die NULL-Werte enthalten. Wir haben auch Beispiele gesehen, wie diese Funktionen verwendet werden können. Viele andere Referenzen befassen sich eingehender mit der Verwendung, den Vorteilen und Einschränkungen dieser Funktionen. Ich kann die Bücher und Blogs von Itzik Ben-Gan als gute Informationsquellen sehr empfehlen.

Referenzen

  • NULLIF (Transact-SQL)
  • COALESCE (Transact-SQL)
  • Artikel von Itzik Ben-Gan