Ini berarti bahwa tidak ada baris akan dikembalikan jika @region
adalah NULL
, bila digunakan dalam contoh pertama Anda, bahkan jika ada baris dalam tabel di mana Region
adalahNULL
.
When ANSI_NULLS
aktif (yang harus selalu Anda aktifkan, karena opsi untuk tidak mengaktifkannya akan dihapus di masa mendatang), operasi perbandingan apa pun di mana (setidaknya) salah satu operan NULL
menghasilkan nilai logika ketiga - UNKNOWN
( sebagai lawan TRUE
dan FALSE
).
UNKNOWN
nilai menyebar melalui operator boolean gabungan jika mereka belum diputuskan (misalnya AND
dengan FALSE
operan atau OR
dengan TRUE
operan) atau negasi ( NOT
).
The WHERE
klausul digunakan untuk menyaring hasil set dihasilkan oleh FROM
klausa, sehingga nilai keseluruhan dari WHERE
klausul harus TRUE
untuk baris untuk tidak difilter. Jadi, jika suatu UNKNOWN
dihasilkan oleh perbandingan apa pun, itu akan menyebabkan baris disaring.
@ user1227804 ini jawaban meliputi kutipan ini:
Jika kedua sisi perbandingan adalah kolom atau ekspresi gabungan, pengaturan tidak mempengaruhi perbandingan.
dari SET ANSI_NULLS
*
Namun, saya tidak yakin poin apa yang coba dibuatnya, karena jika dua NULL
kolom dibandingkan (misalnya dalam a JOIN
), perbandingan masih gagal:
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
Kueri di atas mengembalikan 0 baris, sedangkan:
select * from
Menampilkan satu baris. Jadi meskipun kedua operan adalah kolom, NULL
tidak sama NULL
. Dan dokumentasi untuk=
tidak menjelaskan apa pun tentang operan:
Saat Anda membandingkan dua NULL
ekspresi, hasilnya bergantung pada ANSI_NULLS
pengaturan:
Jika ANSI_NULLS
diatur ke ON
, hasilnya adalah NULL
1 , mengikuti konvensi ANSI bahwa nilai NULL
(atau tidak diketahui) tidak sama dengan nilai lain NULL
atau tidak diketahui.
Jika ANSI_NULLS
diset ke OFF
, hasil dari NULL
dibandingkan dengan NULL
adalah TRUE
.
Membandingkan NULL
dengan non- NULL
nilai selalu menghasilkan FALSE
2 .
Namun, 1 dan 2 salah - hasil dari kedua perbandingan adalah UNKNOWN
.
* Arti samar teks ini akhirnya ditemukan bertahun-tahun kemudian. Artinya sebenarnya, untuk perbandingan tersebut, setelan tidak berpengaruh dan selalu bertindak seolah-olah setelan AKTIF . Akan lebih jelas jika itu menyatakan bahwa SET ANSI_NULLS OFF
itu adalah pengaturan yang tidak berpengaruh.