Firebird Documentation Index → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Come Firebird supporta il NULL nel linguaggio SQL |
Solo pochi elementi del linguaggio sono stati appositamente progettati per determinare un risultato non ambiguo con il NULL; si intende «non ambiguo» nel senso che vengono prese particolari azioni specifiche o risulta un valore che non è NULL. Questi casi sono mostrati nei seguenti paragrafi.
Nella definizione di una colonna o di un dominio, si può specificare che possono essere ammessi solo valori diversi dal NULL, aggiungendo la clausola NOT NULL alla definizione:
create table Tabella ( i int not null )
create domain DComune as varchar( 32 ) not null
Particlare attenzione andrebbe presa aggiungendo un campo NOT NULL ad una tabella già esistente che contiene delle registrazioni. Questa operazione verrà discussa in dettaglio nella sezione Modificare le tabelle piene.
Per sapere se una variabile, un campo, o un'ntera espressione è NULL, è necessario usare la sintassi seguente:
<expression>
IS [NOT] NULL
Esempi:
if ( QuestoCampo is null ) then QuestaStringa = 'Nonso'
select * from Alunni where NumeroTelefono is not null
select * from Alunni where not ( NumeroTelefono is null ) /* fa la stessa cosa dell'esempio precedente */
update NumeriVari set Totale = A + B + C where A + B + C is not null
delete from Agendina where NumTelefono is null
NON usare assolutamente
«... = NULL
» per verificare se
l'espressione è NULL. Questa sintassi è illegale nelle versioni di
Firebird fino alla 1.5.n, e dà risultato sbagliato (o meglio inatteso)
in Firebird 2 e successivi: riporta NULL qualsiasi sia l'espressione da
confrontare. Questo è per progetto ed in tal senso non è
proprio sbagliato – non dà semplicemente il
risultato sperato. Ovviamente lo stesso vale per «... <>
NULL
», pertanto è meglio non usare neanche
questa espressione: va usato invece IS NOT
NULL.
IS NULL e IS NOT NULL
riportano sempre true
oppure
false
; non riportano mai
NULL
.
Per assegnare ad un campo o ad una variabile il
NULL
si usa l'operatore «=», come per tutti gli
altri valori. Si può utilizzare il NULL
anche nelle
liste della clausola INSERT:
if ( Stringaccia = 'Nonso' ) then Campo = nullupdate Patate set Tuberi = null where Importo < 0insert into TabellaX values ( 3, '8-5-2004', NULL, 'Che cosa?' )
Ricordarsi:
Non si può e non si deve usare l'operatore di
comparazione «=» per
controllare se qualcosa è
NULL
...
...ma si può – e spesso si deve – usare l'operatore
di assegnazione «=» per
impostare qualcosa a
NULL
.
Solo da Firebird 2 e successivi, su può paragonare la diversità anche nulla di due espressioni qualsiasi con «IS [NOT] DISTINCT FROM»:
if ( A is distinct from B ) then...
if ( Cliente1 is not distinct from Cliente2 ) then...
I campi, le variabili ed altre espressioni sono considerate:
distinte, usando DISTINCT, se hanno
valori diversi o uno dei valori è NULL
ma non
l'altro;
uguali, usando NOT DISTINCT, se hanno lo
stesso valore oppure se sono entrambe
NULL
.
[NOT] DISTINCT riporta sempre
true
oppure false
, mai NULL o
qualsiasi altra cosa.
Con le versioni precedenti di Firebird bisognava scrivere codice più complesso per ottenere lo stesso risultato. Lo vedremo in seguito.
La possibilità di usare costanti letterali NULL
dipende dalla versione di Firebird utilizzata.
In Firebird 1.5 e precedenti si può usare la parola letterale
«NULL
» solo in alcune situazioni, in
particolare quelle descritte nei precedenti paragrafi più poche altre
come «cast( NULL
as
<datatype>
)» e «select
NULL
from Tabella».
In tutte le altre circostanze, Firebird dirà che
NULL
è un oggetto sconosciuto (unknown
token
). Se si deve usare
NULL
in tali contesti, bisogna ricorrere a
trucchetti del tipo «cast( NULL
as int
)», oppure usare un campo o una variabile che è notoriamente
NULL
.
Firebird 2 permette l'uso di costanti letterali
NULL
in ogni contesto in cui può essere ammesso
un normale valore. Si può, ad esempio, incledere
NULL
in una lista della clausola
IN(), scrivere espressioni come «if ( Campo
= NULL
) then...», e così via. Tuttavia,
come regola generale non si dovrebbe
fare uso di queste nuove possibilità! In quasi tutte le situazioni
pensabili, un tale uso del NULL
è segno di una
progettazione SQL qualitativamente scarsa literals e porta a risultati
NULL
dove invece si desidererebbe
true
oppure false
. In questo
senso la precedente condotta, più restrittiva, è migliore, sebbene si
possa sempre aggirarla con forzature tipo cast
ecc. ma
questo almeno comporta che sia necessario fare certi passi
deliberatamente.
Firebird Documentation Index → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Come Firebird supporta il NULL nel linguaggio SQL |