Firebird Documentation Index → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Ricerche |
Se la condizione di ricerca di una SELECT,
UPDATE o DELETE risolve a
NULL
per certe righe, l'effetto è come se fosse
false
. Mettendola in altro modo, se l'espressione è
NULL
, la condizione non è raggiunta, e di conseguenza
la riga non è inclusa fra quelle selezionate per la ricerca ( o
l'aggiornamento o la cancellazione).
Si dice condizione di ricerca (o search condition o search expression) la clausola WHERE senza la parola iniziale WHERE.
Alcuni esempi, con la condizione di ricerca evidenziata in grassetto:
SELECT Fattori, Mucche FROM Fattorie WHERE Mucche > 0 ORDER BY Mucche
La frase sopra riporta i Fattori che hanno registrata almeno una
mucca. Quelli con un numero sconosciuto (NULL
) non
vengono inclusi, perche l'espressione «NULL >
0
» riporta NULL
.
SELECT Fattori, Micche FROM Fattorie WHERE NOT (Mucche > 0) ORDER BY Mucche
Adesso si sarebbe tentati di dire che questa riporti «tutti
gli altri record» della tabella Fattorie, giusto? No, sbagliato.
Almeno se la colonna Mucche contiene qualche NULL
. Ci
siamo scordati che not(NULL)
è ancora
NULL
? Pertanto per ogni reiga per la quale Mucche è
NULL
, «Cows > 0
»
sarà NULL
, e «NOT (Cows >
0)
» sarà pure NULL
e quindi non sarà
nel record set risultante.
SELECT Fattori, Mucche, Pecore FROM Fattorie WHERE Mucche + Pecore > 0
A prima vista sembra che questa sia una query che genera l'elenco di
tutti i fattori che hanno almeno una nucca o una pecora (assumendo di non
avere mucche o pecore negative...). Tuttavia se il fattore Antonio ha 30
mucche ed un numero sconosciuto di pecore, la somma Mucche +
Pecore
è NULL
, e quindi l'tera condizione
di ricerca risolve a «NULL > 0
», che
è... capito? Così, nonostante le sue 30 mucche, il caro amico Antonio non
sarà mai nell'elenco risultante perchè non soddisfa la condizione di
ricerca.
Per ultimo, riscriviamo l'esempio precedente in modo che riporti
comunque tutti i fattori che hanno almeno un animale
di un qualsiasi tipo, anche se la quantità dell'altro tipo è ignota, cioè
NULL
. Per farlo, approfittiamo del fatto che
«NULL or true
» riporta
true
– uno dei rari casi in cui un operando
NULL
non trasforma l'intera espressione in
NULL
:
SELECT Fattori, Mucche, Pecore FROM Fattorie WHERE Mucche > 0 OR Pecore > 0
In questo caso, le 30 mucche di Antonio rendono il primo confronto
true
, mentre quello con le pecore rimane a
NULL
. Così c'è «true or
NULL
», che è true
, e la riga verrà
inclusa nell'insieme risultante.
Se la condizione di ricerca contiene uno o più predicati
IN, c'è la complicazione che alcuni degli elementi
in lista (o risultati di una subselect) potrebbe essere
NULL
. Le imlicazioni di questo le abbiamo viste ne
Il predicato
IN().
Firebird Documentation Index → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Ricerche |