Significa che nessuna riga verrà restituita se @region
è NULL
, se utilizzata nel primo esempio, anche se sono presenti righe nella tabella in cui si Region
trova NULL
.
Quando ANSI_NULLS
è attivo (che dovresti sempre impostare comunque, poiché l'opzione per non averlo verrà rimossa in futuro), qualsiasi operazione di confronto in cui (almeno) uno degli operandi è NULL
produce il terzo valore logico - UNKNOWN
( al contrario di TRUE
e FALSE
).
UNKNOWN
i valori si propagano attraverso qualsiasi combinazione di operatori booleani se non sono già decisi (ad esempio AND
con un FALSE
operando o OR
con un TRUE
operando) o negazioni ( NOT
).
La WHERE
clausola viene utilizzata per filtrare il set di risultati prodotto dalla FROM
clausola, in modo tale che il valore complessivo della WHERE
clausola deve essere TRUE
affinché la riga non venga filtrata. Quindi, se un confronto UNKNOWN
viene prodotto da qualsiasi confronto, la riga verrà filtrata.
La risposta di @ user1227804 include questa citazione:
Se entrambi i lati del confronto sono colonne o espressioni composte, l'impostazione non influisce sul confronto.
da *SET ANSI_NULLS
Tuttavia, non sono sicuro di quale punto stia cercando di fare, poiché se NULL
vengono confrontate due colonne (ad esempio in a JOIN
), il confronto non riesce ancora:
create table
ID int not null,
Val1 varchar(10) null
)
insert into
create table
ID int not null,
Val1 varchar(10) null
)
insert into
select * from
La query precedente restituisce 0 righe, mentre:
select * from
Restituisce una riga. Quindi, anche quando entrambi gli operandi sono colonne, NULL
non è uguale NULL
. E la documentazione per=
non ha nulla da dire sugli operandi:
Quando confronti due NULL
espressioni, il risultato dipende ANSI_NULLS
dall'impostazione:
Se ANSI_NULLS
è impostato su ON
, il risultato è NULL
1 , seguendo la convenzione ANSI che un valore NULL
(o sconosciuto) non è uguale a un altro NULL
o sconosciuto.
Se ANSI_NULLS
è impostato su OFF
, il risultato di NULL
rispetto a NULL
è TRUE
.
Il confronto NULL
con un non NULL
valore risulta sempre in FALSE
2 .
Tuttavia, sia 1 che 2 non sono corretti: il risultato di entrambi i confronti lo è UNKNOWN
.
* Il significato criptico di questo testo è stato finalmente scoperto anni dopo. Ciò che in realtà significa è che, per questi confronti, l'impostazione non ha effetto e si comporta sempre come se l'impostazione fosse ON . Sarebbe stato più chiaro se avesse affermato che SET ANSI_NULLS OFF
era l'impostazione che non ha avuto alcun effetto.