หมายความว่าจะไม่มีการส่งคืนแถวถ้า@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
เป็นผลลัพธ์คือNULL
1ตามข้อตกลง ANSI ว่าค่าNULL
(หรือไม่ทราบ) ไม่เท่ากับค่าอื่นNULL
หรือไม่ทราบ
หากANSI_NULLS
มีการตั้งค่าOFF
, ผลมาจากการNULL
เทียบกับมีNULL
TRUE
การเปรียบเทียบNULL
กับNULL
ค่าที่ไม่ใช่จะให้ผลลัพธ์เป็นFALSE
2เสมอ
อย่างไรก็ตามทั้ง1และ2ไม่ถูกต้อง - UNKNOWN
ผลของการเปรียบเทียบทั้งสองคือ
* ในที่สุดความหมายที่คลุมเครือของข้อความนี้ก็ถูกค้นพบในอีกหลายปีต่อมา ความหมายที่แท้จริงก็คือสำหรับการเปรียบเทียบเหล่านั้นการตั้งค่าจะไม่มีผลใด ๆ และจะทำหน้าที่เหมือนกับว่าการตั้งค่านั้นเปิดอยู่เสมอ จะชัดเจนกว่านี้หากระบุว่าSET ANSI_NULLS OFF
เป็นการตั้งค่าที่ไม่มีผลกระทบ