Firebird Documentation IndexGuida sull'uso di NULL nel linguaggio SQL di Firebird → Come Firebird supporta il NULL nel linguaggio SQL
Firebird Home Firebird Home Indietro: Guida sull'uso di NULL nel linguaggio SQL di FirebirdFirebird Documentation IndexRisali: Guida sull'uso di NULL nel linguaggio SQL di FirebirdAvanti: NULL nelle espressioni

Come Firebird supporta il NULL nel linguaggio SQL

Impedire il NULL
Controllare un campo per NULL
Assegnare NULL
Controllare la diversità (Firebird 2+)
La costante letterale NULL

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.

Impedire il NULL

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.

Controllare un campo per NULL

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.

Assegnare 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 = null
update Patate set Tuberi = null where Importo < 0
insert 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.

Controllare la diversità (Firebird 2+)

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 costante letterale NULL

La possibilità di usare costanti letterali NULL dipende dalla versione di Firebird utilizzata.

Fino a Firebird 1.5 compreso

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.0 and up

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.

Indietro: Guida sull'uso di NULL nel linguaggio SQL di FirebirdFirebird Documentation IndexRisali: Guida sull'uso di NULL nel linguaggio SQL di FirebirdAvanti: NULL nelle espressioni
Firebird Documentation IndexGuida sull'uso di NULL nel linguaggio SQL di Firebird → Come Firebird supporta il NULL nel linguaggio SQL