หมายความว่าจะไม่มีการส่งคืนแถวถ้า@regionเป็นNULLเมื่อใช้ในตัวอย่างแรกของคุณแม้ว่าจะมีแถวในตารางRegionอยู่NULLก็ตาม
เมื่อANSI_NULLSเปิด (ซึ่งคุณควรตั้งค่าไว้เสมอเนื่องจากตัวเลือกที่จะไม่เปิดใช้งานจะถูกลบออกในอนาคต) การดำเนินการเปรียบเทียบใด ๆ ที่ (อย่างน้อย) ตัวถูกดำเนินการตัวใดตัวหนึ่งNULLสร้างค่าลอจิกที่สาม - UNKNOWN( ซึ่งตรงข้ามกับTRUEและFALSE)
UNKNOWNค่าเผยแพร่ผ่านการรวมผู้ประกอบการบูลีนถ้าพวกเขาไม่ได้ตัดสินใจแล้วใด ๆ (เช่นANDมีFALSEตัวถูกดำเนินการหรือORมีTRUEตัวถูกดำเนินการ) หรือ negations ( NOT)
ส่วนWHEREคำสั่งใช้เพื่อกรองผลลัพธ์ที่กำหนดโดยFROMอนุประโยคเพื่อให้ค่าโดยรวมของWHEREอนุประโยคต้องเป็นTRUEเพื่อไม่ให้แถวถูกกรองออก ดังนั้นหากUNKNOWNเกิดจากการเปรียบเทียบใด ๆ ก็จะทำให้แถวนั้นถูกกรองออก
คำตอบของ @ user1227804 รวมถึงคำพูดนี้:
หากทั้งสองด้านของการเปรียบเทียบเป็นคอลัมน์หรือนิพจน์ผสมการตั้งค่าจะไม่มีผลต่อการเปรียบเทียบ
จาก*SET ANSI_NULLS
อย่างไรก็ตามฉันไม่แน่ใจว่าจุดใดที่พยายามสร้างขึ้นเนื่องจากหากNULLมีการเปรียบเทียบสองคอลัมน์ (เช่นใน a JOIN) การเปรียบเทียบยังคงล้มเหลว:
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
คำค้นหาด้านบนส่งคืน 0 แถวในขณะที่:
select * from
ส่งคืนหนึ่งแถว ดังนั้นแม้เมื่อทั้งสองตัวถูกดำเนินการที่มีคอลัมน์ไม่เท่ากับNULL NULLและเอกสารสำหรับ=ไม่มีอะไรจะพูดเกี่ยวกับตัวถูกดำเนินการ:
เมื่อคุณเปรียบเทียบสองNULLนิพจน์ผลลัพธ์จะขึ้นอยู่กับการANSI_NULLSตั้งค่า:
หากANSI_NULLSตั้งค่าONเป็นผลลัพธ์คือNULL1ตามข้อตกลง ANSI ว่าค่าNULL(หรือไม่ทราบ) ไม่เท่ากับค่าอื่นNULLหรือไม่ทราบ
หากANSI_NULLSมีการตั้งค่าOFF, ผลมาจากการNULLเทียบกับมีNULLTRUE
การเปรียบเทียบNULLกับNULLค่าที่ไม่ใช่จะให้ผลลัพธ์เป็นFALSE2เสมอ
อย่างไรก็ตามทั้ง1และ2ไม่ถูกต้อง - UNKNOWNผลของการเปรียบเทียบทั้งสองคือ
* ในที่สุดความหมายที่คลุมเครือของข้อความนี้ก็ถูกค้นพบในอีกหลายปีต่อมา ความหมายที่แท้จริงก็คือสำหรับการเปรียบเทียบเหล่านั้นการตั้งค่าจะไม่มีผลใด ๆ และจะทำหน้าที่เหมือนกับว่าการตั้งค่านั้นเปิดอยู่เสมอ จะชัดเจนกว่านี้หากระบุว่าSET ANSI_NULLS OFFเป็นการตั้งค่าที่ไม่มีผลกระทบ