Firebird Documentation IndexGuida sull'uso di NULL nel linguaggio SQL di Firebird → Ricerche
Firebird Home Firebird Home Indietro: I predicatiFirebird Documentation IndexRisali: Guida sull'uso di NULL nel linguaggio SQL di FirebirdAvanti: Gli ordinamenti

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

Nota

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.

Attenzione

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().

Indietro: I predicatiFirebird Documentation IndexRisali: Guida sull'uso di NULL nel linguaggio SQL di FirebirdAvanti: Gli ordinamenti
Firebird Documentation IndexGuida sull'uso di NULL nel linguaggio SQL di Firebird → Ricerche