Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Gestione dei NULL in SQL Server

Cos'è NULL? NULL o l'indicatore NULL è il modo in cui rappresentiamo un valore sconosciuto in SQL, con SQL mi riferisco al linguaggio di query strutturato standard, non a MS SQL Server. L'ultima frase ci riporta un po' indietro nel tempo al 1969 quando lo standard fu definito per la prima volta dal Dr. E.F. Codd. NULL diventa necessario perché dobbiamo pensare in termini di quella che viene chiamata logica dei predicati a tre valori. Un predicato è la proprietà di un'espressione che vale o non vale. A prima vista, si penserebbe a due possibilità:VERO o FALSO. Tuttavia, esiste una terza possibilità:SCONOSCIUTO.

Facciamo un esempio. Supponendo che un attributo (colonna) nella nostra relazione (Tabella) rappresenti il ​​codice fiscale (TIN) di un insieme di proprietari di piccole imprese ad Accra, in Ghana. La colonna per il record di ciascun imprenditore verrà compilata con il suo TIN e possiamo utilizzare questa colonna per determinare qualche altro attributo, ad esempio se è aggiornato nei pagamenti delle tasse. Tuttavia, ci sono due possibilità extra in questo caso d'uso:

  1. Il titolare dell'attività ha un codice fiscale ed è aggiornato.
  2. Il titolare dell'attività non ha un codice fiscale e (ovviamente) non è aggiornato.

Quanto sopra descrive ciò che il Dr. Codd chiamava logica dei predicati a quattro valori. Lo standard SQL, tuttavia, semplifica queste due condizioni aggiuntive definendolo sconosciuto, ovvero NULL. Non conosciamo il TIN dell'imprenditore e non possiamo determinare nessun altro valore dall'attributo dell'imprenditore interessato. Quindi, NULL è SCONOSCIUTO ed è il terzo valore nella logica dei predicati standard a tre valori.

NULL è speciale

La definizione di NULL richiede il trattamento del marker in modo diverso dai valori effettivi. I seguenti sono esempi:

  1. Non esiste il filtro "WHERE =NULL;". L'espressione corretta sarebbe "WHERE IS NULL;". Lo stesso vale per l'espressione inversa.
  2. Quando si ordina SQL in ordine crescente, è possibile scegliere di elencare i NULL per primi o per ultimi. L'impostazione predefinita è elencare prima i NULL.
  3. Non puoi confrontare i valori NULL. Questo dovrebbe essere ovvio poiché abbiamo detto che NULL è SCONOSCIUTO.
  4. Quando un tentativo di concatenazione coinvolge una colonna NULL, il risultato è NULL.

Funzioni comuni relative a NULL

Di seguito sono elencate tre funzioni comuni relative a NULL in SQL Server

ISNULLO

ISNULL – Sostituisce NULL con un valore di sostituzione specificato. Il Listato 1 e la Fig 1 mostrano semplici esempi di ISNULL.

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

Fig 1:semplice esempio di ISNULL

NULLIF

NULLIF restituisce NULL è il valore dei due argomenti sono uguali.

-- 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;

Fig. 2:Esempio semplice di NULLIF

COALESCE

COALESCE restituisce il primo valore non NULL dall'elenco fornito. Il Listato 1 ne mostra degli esempi e la Figura 1 mostra l'output delle query.

-- 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;

Fig 3:Semplice Esempio di Coalesce

Si noti che questi semplici esempi espongono all'uso della natura di NULL. NULL e lo spazio vuoto NON sono gli stessi. Nella prima istruzione, COALESCE restituisce uno spazio vuoto che ci mostra che uno spazio vuoto è il primo valore non NULL nell'elenco.

Differenze tra ISNULL e COALESCE

Le differenze tra ISNULL e COALESCE sono state oggetto di numerosi articoli online e libri come quelli elencati nella sezione riferimenti. Queste differenze sono riassunte come segue:

  1. ISNULL è proprietario di SQL Server mentre COALESCE è una funzione standard ANSI. Ciò implica che per la portabilità è preferito COALESCE.
  2. ISNULL accetta solo due argomenti mentre COALESCE può richiedere più di due argomenti.
  3. Il tipo di dati del valore restituito da ISNULL è determinato dal tipo di dati del primo argomento mentre il tipo di dati del valore restituito da COALESCE è determinato dal tipo di dati nell'elenco con la precedenza più alta.
  4. Quando entrambe le funzioni vengono utilizzate con le sottoquery, ISNULL ha prestazioni migliori perché COALESCE è tradotto internamente in un'espressione CASE che tende a ripetere le scansioni.

Itzik Ben-Gan esplora anche altre implicazioni della conversione di COALESCE in un'espressione di caso nel suo articolo il cui collegamento è fornito alla fine di questo articolo.

Casi d'uso di esempio

Vogliamo visualizzare su un portale web l'elenco dei clienti in base a determinati criteri dalla tabella che stiamo creando nel Listato 4. Le attività 1 e 2 danno a possibili requisiti e utilizziamo ISNULL e COALESCE per soddisfare i requisiti.

--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);

Fig. 4 Tabella di esempio

Compito 1 :restituisce l'elenco di tutti i clienti che non hanno fornito un numero di telefono alternativo.

--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 ;

Utilizzando COALESCE (o ISNULL), possiamo presentare le informazioni richieste molto meglio utilizzando un testo che dice "Nessun telefono secondario".

Fig. 5 Set di risultati per il Listato 5

Attività 2 :restituisce l'elenco di tutti i clienti, il loro numero di telefono principale, e qualsiasi altro numero di telefono alternativo.

--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  ;

Fig. 6 Set di risultati per il Listato 6

In questo caso, ISNULL non è un'opzione poiché stiamo passando tre argomenti.

Conclusione

In questo articolo, abbiamo discusso il concetto di NULL in relazione alla logica del predicato a tre valori e descritto le funzioni popolari usate in SQL Server per gestire i set di dati contenenti NULL. Abbiamo anche visto esempi di come queste funzioni possono essere utilizzate. Molti altri riferimenti approfondiscono l'uso, i vantaggi e i limiti di queste funzioni. Consiglio vivamente i libri e i blog di Itzik Ben-Gan come buone fonti di informazioni.

Riferimenti

  • NULLIF (Transact-SQL)
  • COALESCE (Transact-SQL)
  • Articolo di Itzik Ben-Gan