Firebird Documentation Index → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Convertire da e verso NULL |
In Firebird 1.5 e successivi c'è una funzione che è in grado di
convertire NULL
a quasi qualsiasi altra cosa.
Questo permette di fare una conversione al volo e di usare il
risultato per ulteriori elaborazioni, senza l'uso del costrutto
«if (Espressione is null) then
».
Questa particolare funzione è la COALESCE
e si
usa in questo modo:
COALESCE( Espr1, Espr2, Espr3, ... )
COALESCE
riporta il valore della prima
espressione diversa da NULL
della lista degli
argomenti. Se tutte le espressioni sono NULL
, la
COALESCE
riporta
NULL
.
Questo è il modo in cui per esempio si può usare
COALESCE
per ricostruire il nome completo di una
persona a partire da nome, cognome e titolo, assumendo che talvolta il
campo Titolo possa essere NULL
:
select coalesce ( Titolo || ' ', '' ) || Cognome || ' ' || Nome from Persone
Oppure, per creare un nominativo il più informale possibile a
partire da una tabella che contenga anche i soprannomi, e assumendo
che possano essere NULL
sia i soprannomi che i
nomi:
select coalesce (Soprannome, Nome, 'Sig./Sig.ra') || ' ' || Cognome from AltrePersone
COALESCE
può venire in aiuto solo in quelle
situazioni in cui il valore NULL
può essere
gestito allo stesso modo degli altri valori permessi per il tipo di
dato. Se NULL
necessità di una gestione
particolare, diversa da ogni altro valore, l'unica opzione è usare un
costrutto con IF o con
CASE.
In Firebird 1.0 non c'è la funzione
COALESCE
. Tuttavia si possono usare quattro
funzioni UDF che permettono una buona parte della sua funzionalità.
Queste UDF risiedono nella libreria fbudf
e sono precisamente:
iNVL
, per argomenti interi
i64NVL
, per argomenti bigint
dNVL
, per argomenti in duplice
precisione
sNVL
, per le stringhe
Le funzioni
hanno
esattamente due argomenti. Come *NVL
COALESCE
,
riportano il primo argomento se non è NULL
;
altrimenti, riportano il secondo. Notare che in Firebird 1.0 la
libreria fbudf
e pertanto le
funzioni *NVL
sono solo disponibili in ambiente
Windows.
Talvolta è utile avere certi valori a NULL
in
uscita, o cime valori intermedi. Non capita spesso, ma potrebe essere
utile, per esempio, per escludere certi valori da una sommatoria o da
una media. Le funzioni NULLIF
possono fare questo,
anche se per un valore alla volta.
La funzione interna NULLIF ha due argomenti: se sono uguali, la
funzione riporta NULL
. Altrimenti riporta il
valore del primo argomento.
Un tipico esempio è
select avg( nullif( Peso, -1 ) ) from Ciccioni
che darà il peso medio della popolazione dei Ciccioni, senza
contare quelli con peso -1, ricordando che le funzioni di aggregazione
come AVG escludono dal conteggio tutti i campi a
NULL.
Lavorando un po' su questo esempio, supponiamo che finora si
fosse usato -1 per indicare «peso sconosciuto» perchè non
sicuri sull'uso di NULL
. Dopo aver letto questa
guida, si sarà pratici abbastanza da dare il comando:
update Ciccioni set Peso = nullif( Peso, -1 )
A questo punto, finalmente i pesi sconosciuti saranno realmente sconosciuti.
Firebird 1.0.x non ha la funzione interna
NULLIF
. Al suo posto ha quattro funzioni UDF
nella libreria fbudf
per
ottenere il medesimo obiettivo:
inullif
, per argomenti interi
i64nullif
, per argomenti bigint
dnullif
, per argomenti in duplice
precisione (double precision)
snullif
, per argomenti stringhe
Notare che la libreria di Firebird 1.0 fbudf
e quindi anche l'insieme di
funzioni*nullif
è disponibile solo in
Windows.
Le note di rilascio di Firebird 1 dicono che, a causa di una
limitazione del sistema, queste UDF riportano un valore equivalente
a zero se gli argomenti sono identici. Ciò è sbagliato: se gli
argomenti hanno lo stesso valore, le funzioni riportano un vero e
proprio NULL
.
Notare che riportano NULL
anche quando il
primo valore è un valore vero e proprio ed il secondo argomento è
NULL
. Questo è un risoltato sbagliato: invece
le funzioni interne NULLIF
di Firebird 1.5
correttamente riportano il primo argomento.
Firebird Documentation Index → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Convertire da e verso NULL |