ไม่เท่ากับ <>! = โอเปอเรเตอร์ใน NULL


271

มีคนช่วยอธิบายพฤติกรรมต่อไปนี้ใน SQL ได้ไหม?

SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)

คำตอบ:


309

<>คือมาตรฐาน SQL-92 !=มันเทียบเท่า ทั้งสองประเมินค่าซึ่งNULLไม่ได้NULLเป็นตัวยึดตำแหน่งที่จะบอกว่าไม่มีค่า

นี่คือเหตุผลที่คุณสามารถใช้IS NULL/ IS NOT NULLเป็นเพรดิเคตสำหรับสถานการณ์ดังกล่าวเท่านั้น

ลักษณะการทำงานนี้ไม่เฉพาะ SQL Server ภาษา SQL ที่สอดคล้องกับมาตรฐานทั้งหมดทำงานในลักษณะเดียวกัน

หมายเหตุ : เพื่อเปรียบเทียบถ้าค่าไม่เป็นโมฆะคุณสามารถใช้IS NOT NULLในขณะที่เปรียบเทียบกับไม่เป็นโมฆะ<> 'YOUR_VALUE'ค่าที่คุณใช้ ฉันไม่สามารถบอกได้ว่าค่าของฉันเท่ากับหรือไม่เท่ากับ NULL แต่ฉันสามารถพูดได้ว่าค่าของฉันเป็น NULL หรือไม่ NULL ฉันสามารถเปรียบเทียบได้ว่าค่าของฉันเป็นอย่างอื่นที่ไม่ใช่ NULL หรือไม่


4
อันที่จริงผมเชื่อว่ามันเป็น<>ที่อยู่ในสเปค 92 แต่ส่วนใหญ่ผู้ให้บริการสนับสนุน!=และ / หรือมันจะรวมอยู่ในสเป็คในภายหลังเช่น 99 หรือ 03
โทมัส

2
@ โทมัส: Oracle ไม่ได้รับการสนับสนุน!=จนกระทั่ง ~ 9i ตามที่ฉันเข้าใจซึ่งทำให้เกิดไวยากรณ์ ANSI-92 จำนวนมาก ความเชื่อของฉันคือ MySQL นั้นคล้ายกันเริ่มสนับสนุนใน 4.x
OMG Ponies

ที่ดูเหมือนจะชี้ให้เห็นว่าอาจได้รับการรวมอยู่ในข้อมูลจำเพาะต่อมาเป็นทางเลือกที่จะ!= <>ไม่มีมือของฉันในรายละเอียดใหม่ดังนั้นฉันไม่สามารถพูดได้อย่างแน่นอน
โทมัส

2
เป็นผลมาจากWHERE MyColumn != NULLหรือWHERE MyColumn = NULLกำหนดขึ้น? หรือกล่าวอีกนัยหนึ่งคือมันรับประกันว่าจะส่งคืน 0 แถวเสมอไม่ว่าMyColumnจะเป็นโมฆะในฐานข้อมูลหรือไม่
Slauma

11
ควรสังเกตว่าเนื่องจาก!=ประเมินเฉพาะค่าการทำบางสิ่งเช่นWHERE MyColumn != 'somevalue'จะไม่ส่งคืนระเบียน NULL
jsumrall

88

NULL ไม่มีค่าดังนั้นจึงไม่สามารถเปรียบเทียบได้โดยใช้ตัวดำเนินการค่าสเกลาร์

กล่าวอีกนัยหนึ่งไม่มีค่าใดสามารถเท่ากับ (หรือไม่เท่ากับ) NULL เนื่องจาก NULL ไม่มีค่า

ดังนั้น SQL จึงมีค่าพิเศษคือ NULL และไม่ใช่ NULL predicates สำหรับจัดการกับ NULL


3
+1 และตรงกันข้ามกับคำสั่ง OP นี่ไม่ใช่ "Microsoft SQL" ตรรกะแบบไบนารีถูกกำหนดใน SQL Standard และ MS ในจุดนี้ให้เป็นไปตามมาตรฐาน
TomTom

6
ฉันไม่ได้บอกว่านี่เป็นพฤติกรรมของ Microsoft เท่านั้น ฉันแค่บอกว่าฉันสังเกตมันบน Microsoft SQL Server
Maxim Gershkovich

13
จากสถานการณ์ที่น่าสนใจมีสถานการณ์ใดบ้างที่พฤติกรรมนี้ (คาดว่า) มีประโยชน์หรือไม่ ดูเหมือนว่าฉันจะ'a' != nullไม่ส่งคืนค่า ( true/ 1) เป็นตัวนับที่ใช้งานง่ายและจับฉันออกเป็นครั้งคราว! ฉันเคยคิดว่า "คุณค่าบางอย่างเมื่อเทียบกับไม่มีค่า" มักจะเป็น "ไม่เท่ากัน" แต่อาจเป็นเพียงฉันนั่น?
DarthPablo

1
ฉันคิดว่ามันน่าสนใจที่ผู้คนอธิบายว่า NULL ว่า ' ไม่มีคุณค่า ' ในทำนองเดียวกันการบอกว่าหมายเลข 1 'มีค่า' เมื่อเป็นค่าจริง แต่ NULL แทนค่าไม่ใช่ ..
systemaddict

เป็นวิธีแก้ปัญหาด้วยตนเองคุณสามารถSELECT * FROM MyTable WHERE coalesce(MyColumn, 'x') <> 'x'กำหนดค่าคงที่ถ้าเป็นค่า NULL โดยให้คุณกำหนดประเภทข้อมูลที่เหมาะสมสำหรับค่า Sentinel x (ในกรณีนี้คือสตริง / ถ่าน) นี่คือไวยากรณ์ TSQL แต่ Oracle และเอ็นจิ้นอื่นมีคุณสมบัติที่คล้ายกัน
systemaddict

26

โปรดทราบว่าพฤติกรรมนี้เป็นพฤติกรรมเริ่มต้น (ANSI)

ถ้าคุณ:

 SET ANSI_NULLS OFF

http://msdn.microsoft.com/en-us/library/ms188048.aspx

คุณจะได้รับผลลัพธ์ที่แตกต่าง

SET ANSI_NULLS OFF ดูเหมือนจะหายไปในอนาคต ...


8
+1 ... ไม่เร็วพอ ตอนนี้ฉันจะได้รับ "ซ้ำ" NULLs ในดัชนีได้อย่างไร :(

คุณสามารถรับค่า NULL ที่ซ้ำกันในดัชนี SQL Server ได้โดยเพิ่มส่วนคำสั่ง WHERE ในดัชนีที่กรองแล้ว (เช่นcreate unique index UK_MyTable on MyTable (Column) where Column is not null): msdn.microsoft.com/en-us/library/cc280372.aspx
Anthony Mills

3
หมายเหตุจากเอกสาร: เมื่อSET ANSI_NULLSปิดการทำงานตัวดำเนินการเปรียบเทียบ Equals (=) และ Not Equal To (<>) จะไม่เป็นไปตามมาตรฐาน ISO คำสั่ง SELECT ที่ใช้WHERE column_name = NULLส่งคืนแถวที่มีค่า Null ใน column_name คำสั่ง SELECT ที่ใช้WHERE column_name <> NULLส่งคืนแถวที่มีค่าไม่เป็นศูนย์ในคอลัมน์ นอกจากนี้คำสั่ง SELECT ที่ใช้WHERE column_name <> XYZ_valueส่งคืนแถวทั้งหมดที่ไม่ใช่ XYZ_value และไม่ใช่ NULL IMHO ข้อความล่าสุดนี้ดูแปลก ๆ เล็กน้อยในการยกเว้นค่า null จากผลลัพธ์!
DarthPablo

4
หมายเหตุสำคัญจากmsdn doc : ในรุ่นอนาคตของ SQL Server [ใหม่กว่า 2014] ANSI_NULLS จะเปิดอยู่เสมอและแอปพลิเคชันใด ๆ ที่ตั้งค่าตัวเลือกเป็น OFF อย่างชัดเจนจะสร้างข้อผิดพลาด หลีกเลี่ยงการใช้คุณสมบัตินี้ในงานพัฒนาใหม่และวางแผนแก้ไขแอปพลิเคชั่นที่ใช้คุณสมบัตินี้ในปัจจุบัน
Otiel

7

ใน SQL ทุกสิ่งที่คุณประเมิน / คำนวณด้วยNULLผลลัพธ์ใน UNKNOWN

นี่คือสาเหตุSELECT * FROM MyTable WHERE MyColumn != NULLหรือSELECT * FROM MyTable WHERE MyColumn <> NULLให้ผลลัพธ์ 0 รายการแก่คุณ

เพื่อให้การตรวจสอบNULLค่าฟังก์ชั่น isNull มีให้

นอกจากนี้คุณสามารถใช้ISโอเปอเรเตอร์ตามที่คุณใช้ในคิวรีที่สาม

หวังว่านี่จะช่วยได้


"ใน SQL ทุกสิ่งที่คุณประเมิน / คำนวณด้วยผลลัพธ์ NULL เป็น 'NULL'" - ไม่ถูกต้อง ผลลัพธ์ที่คุณหมายถึงคือไม่รู้จัก
oneday เมื่อ

@MahendraLiya ไม่ได้จัดเตรียมฟังก์ชัน isNull เพื่อตรวจสอบ NULLS แต่จะ " แทนที่ NULL ด้วยค่าการแทนที่ที่ระบุ " คุณควรใช้ IS NULL หรือ IS NULL แทน ISNULL ซึ่งแตกต่างกัน
วิศวกรที่กลับรายการ

7

การทดสอบเพียงอย่างเดียวสำหรับ NULL คือ NULL หรือไม่ NULL การทดสอบความเท่าเทียมกันนั้นเป็นเรื่องไร้สาระเพราะตามนิยามแล้วเราไม่ทราบว่าค่าคืออะไร

นี่คือบทความวิกิพีเดียที่จะอ่าน:

https://en.wikipedia.org/wiki/Null_(SQL)


6

เราใช้

SELECT * FROM MyTable WHERE ISNULL(MyColumn, ' ') = ' ';

เพื่อกลับแถวทั้งหมดที่ MyColumn เป็น NULL หรือแถวทั้งหมดที่ MyColumn เป็นสตริงว่าง สำหรับหลาย ๆ คน "ผู้ใช้" ปัญหา NULL เทียบกับสตริงว่างคือความแตกต่างโดยไม่จำเป็นต้องและจุดของความสับสน


5

ฉันไม่เห็นเหตุผลเชิงหน้าที่และไร้รอยต่อสำหรับโมฆะที่ไม่สามารถเทียบได้กับค่าอื่น ๆ หรือโมฆะอื่น ๆ ทำให้เราสามารถเปรียบเทียบได้อย่างชัดเจนและบอกว่าพวกเขาเหมือนกันหรือไม่ในบริบทของเรา มันสนุกมาก. เพียงเพราะข้อสรุปเชิงตรรกะและความมั่นคงบางประการเราจำเป็นต้องกังวลอยู่ตลอดเวลาด้วย มันใช้งานไม่ได้ทำให้ใช้งานได้มากกว่าและทิ้งไว้ให้กับนักปรัชญาและนักวิทยาศาสตร์เพื่อสรุปว่ามันสอดคล้องหรือไม่และมันถือ "ตรรกะสากล" :) บางคนอาจบอกว่าเป็นเพราะดัชนีหรืออย่างอื่นฉันสงสัยว่าสิ่งเหล่านั้นไม่สามารถทำได้เพื่อสนับสนุนค่า null เช่นเดียวกับค่า มันเหมือนกับการเปรียบเทียบแก้วเปล่าสองอันอันหนึ่งคือแก้วเถาวัลย์และอีกแก้วเป็นเบียร์เราไม่ได้เปรียบเทียบประเภทของวัตถุ แต่มีค่าเช่นเดียวกับที่คุณสามารถเปรียบเทียบ int และ varchar กับ null ได้ ' ง่ายกว่ามันไม่มีอะไรและไม่มีอะไรสองอย่างที่เหมือนกันพวกมันเหมือนกันอย่างชัดเจนเทียบเคียงได้กับฉันและคนอื่น ๆ ที่เขียน sql เพราะเรามักจะผิดตรรกะนั้นโดยการเปรียบเทียบพวกมันด้วยวิธีแปลก ๆ เพราะมาตรฐาน ANSI บางอย่าง ทำไมไม่ใช้พลังคอมพิวเตอร์ทำเพื่อเราและฉันสงสัยว่ามันจะช้าลงหากทุกอย่างที่เกี่ยวข้องกับการสร้างขึ้นในใจ "มันไม่ได้เป็นโมฆะไม่มีอะไรเลย" ไม่ใช่แอปเปิ้ลเป็น apfel มา ... ฟังก์ชั่นคือเพื่อนของคุณและมันก็มีเหตุผลที่นี่ ในที่สุดสิ่งเดียวที่สำคัญก็คือฟังก์ชั่นการใช้งานและการใช้ nulls ในทางที่นำมาซึ่งการทำงานมากขึ้นและน้อยลงและใช้งานง่าย มันมีประโยชน์มากกว่านี้ไหม? เพราะเรามักจะทำลายตรรกะนั้นอย่างต่อเนื่องโดยการเปรียบเทียบพวกมันด้วยวิธีแปลก ๆ เพราะมาตรฐาน ANSI บางอย่าง ทำไมไม่ใช้พลังคอมพิวเตอร์ทำเพื่อเราและฉันสงสัยว่ามันจะช้าลงหากทุกอย่างที่เกี่ยวข้องกับการสร้างขึ้นในใจ "มันไม่ได้เป็นโมฆะไม่มีอะไรเลย" ไม่ใช่แอปเปิ้ลเป็น apfel มา ... ฟังก์ชั่นคือเพื่อนของคุณและมันก็มีเหตุผลที่นี่ ในที่สุดสิ่งเดียวที่สำคัญก็คือฟังก์ชั่นการใช้งานและการใช้ nulls ในทางที่นำมาซึ่งการทำงานมากขึ้นและน้อยลงและใช้งานง่าย มันมีประโยชน์มากกว่านี้ไหม? เพราะเรามักจะทำลายตรรกะนั้นอย่างต่อเนื่องโดยการเปรียบเทียบพวกมันด้วยวิธีแปลก ๆ เพราะมาตรฐาน ANSI บางอย่าง ทำไมไม่ใช้พลังคอมพิวเตอร์ทำเพื่อเราและฉันสงสัยว่ามันจะช้าลงหากทุกอย่างที่เกี่ยวข้องกับการสร้างขึ้นในใจ "มันไม่ได้เป็นโมฆะไม่มีอะไรเลย" ไม่ใช่แอปเปิ้ลเป็น apfel มา ... ฟังก์ชั่นคือเพื่อนของคุณและมันก็มีเหตุผลที่นี่ ในที่สุดสิ่งเดียวที่สำคัญก็คือฟังก์ชั่นการใช้งานและการใช้ nulls ในทางที่นำมาซึ่งการทำงานมากขึ้นและน้อยลงและใช้งานง่าย มันมีประโยชน์มากกว่านี้ไหม? ไม่แอปเปิ้ลมันเป็น apfel มา ... ฟังก์ชั่นเป็นเพื่อนของคุณและยังมีตรรกะที่นี่ ในที่สุดสิ่งเดียวที่สำคัญก็คือฟังก์ชั่นการใช้งานและการใช้ nulls ในทางที่นำมาซึ่งการทำงานมากขึ้นและน้อยลงและใช้งานง่าย มันมีประโยชน์มากกว่านี้ไหม? ไม่แอปเปิ้ลมันเป็น apfel มา ... ฟังก์ชั่นเป็นเพื่อนของคุณและยังมีตรรกะที่นี่ ในที่สุดสิ่งเดียวที่สำคัญก็คือฟังก์ชั่นการใช้งานและการใช้ nulls ในทางที่นำการทำงานมากขึ้นและน้อยลงและใช้งานง่าย มันมีประโยชน์มากกว่านี้ไหม?

พิจารณารหัสนี้:

SELECT CASE WHEN NOT (1 = null or (1 is null and null is null)) THEN 1 ELSE 0 end

มีกี่คนที่รู้ว่ารหัสนี้จะส่งคืนอย่างไร ไม่ว่าจะมีหรือไม่มีก็ให้ผลตอบแทน 0 สำหรับฉันที่ใช้งานไม่ได้และมันสับสน ใน c # มันคือทั้งหมดที่มันควรจะเป็นคือการเปรียบเทียบการดำเนินการส่งคืนค่าตรรกะเหตุผลนี้ก็สร้างมูลค่าเพราะถ้ามันไม่ได้มีอะไรที่จะเปรียบเทียบ (ยกเว้น. ไม่มีอะไร :)) พวกเขาเพียงแค่ "พูดว่า": สิ่งใดก็ตามที่เปรียบเทียบกับ null "จะส่งคืน" 0 และนั่นทำให้เกิดการแก้ไขปัญหาและปวดหัวจำนวนมาก

นี่คือรหัสที่นำมาให้ฉันที่นี่:

where a != b OR (a is null and b IS not null) OR (a IS not null and b IS null)

ฉันแค่ต้องเปรียบเทียบว่าสองฟิลด์ (ในที่) มีค่าที่แตกต่างกันฉันสามารถใช้ฟังก์ชั่น แต่ ...


4

NULL ไม่สามารถเปรียบเทียบกับค่าใด ๆ ได้โดยใช้ตัวดำเนินการเปรียบเทียบ NULL = NULL เป็นเท็จ Null ไม่ใช่ค่า ผู้ประกอบการ IS ได้รับการออกแบบมาเป็นพิเศษเพื่อจัดการการเปรียบเทียบค่า NULL


5
ฉันสนุกกับคนสับสนอยู่เสมอเมื่อบางครั้งฉันก็ใช้ในnull = nullที่ที่อาจใช้1=0ในการสอบถามเฉพาะกิจ และถ้าพวกเขาบ่นผมเปลี่ยนไปnull != null:)
SWeko

8
"NULL = NULL เป็นเท็จ" ไม่เช่นนั้น NULL = NULL ประเมินว่าไม่รู้จักและไม่เป็นเท็จ
nvogel

@dportas นั้นเป็นเช่นนั้น แต่ฉันหมายความว่าในเงื่อนไขจะไม่ถูกประเมินว่าเป็นจริง
Vincent Ramdhanie

@VincentRamdhanie ไม่เป็นเท็จ ในความเป็นจริงใน postgres มันจะถูกประเมินเป็น NULL
Pere

2

คำถามเก่า แต่ต่อไปนี้อาจให้รายละเอียดเพิ่มเติมบางอย่าง

nullแทนค่าหรือค่าที่ไม่รู้จัก ไม่ได้ระบุสาเหตุที่ไม่มีค่าซึ่งอาจนำไปสู่ความคลุมเครือบางอย่าง

สมมติว่าคุณเรียกใช้แบบสอบถามเช่นนี้:

SELECT *
FROM orders
WHERE delivered=ordered;

นั่นคือคุณกำลังมองหาแถวที่orderedและdeliveredวันที่เหมือนกัน

จะต้องเกิดอะไรขึ้นเมื่อหนึ่งหรือทั้งสองคอลัมน์เป็นโมฆะ

เนื่องจากไม่ทราบวันที่อย่างน้อยหนึ่งวันคุณไม่สามารถคาดหวังได้ว่าวันที่ 2 จะเหมือนกัน นี่เป็นกรณีที่ไม่ทราบวันที่ทั้งสอง : พวกเขาจะเหมือนกันได้อย่างไรถ้าเราไม่รู้ด้วยซ้ำว่ามันคืออะไร?

ด้วยเหตุนี้การแสดงออกใด ๆ ที่ถือว่าnullเป็นค่าจะต้องล้มเหลว ในกรณีนี้มันจะไม่ตรงกัน นี่เป็นกรณีนี้หากคุณลองทำสิ่งต่อไปนี้:

SELECT *
FROM orders
WHERE delivered<>ordered;

อีกครั้งเราจะพูดได้อย่างไรว่าสองค่านั้นไม่เหมือนกันถ้าเราไม่รู้ว่ามันคืออะไร

SQL มีการทดสอบเฉพาะสำหรับค่าที่หายไป:

IS NULL

โดยเฉพาะมันไม่ได้เป็นการเปรียบเทียบค่า แต่มันจะหาค่าที่ขาดหายไป

ในที่สุดเกี่ยวกับ!=ผู้ประกอบการเท่าที่ฉันรู้ว่ามันไม่ได้อยู่ในมาตรฐานใด ๆ แต่ได้รับการสนับสนุนอย่างกว้างขวางมาก มีการเพิ่มเพื่อให้โปรแกรมเมอร์จากบางภาษารู้สึกเหมือนอยู่บ้าน ตรงไปตรงมาหากโปรแกรมเมอร์มีปัญหาในการจำภาษาที่ใช้อยู่พวกเขาจะเริ่มต้นไม่ดี


นี่เป็นตรรกะ "ไร้สาระ" เดียวกับที่ @Hove อธิบายไว้ในคำตอบของเขา ความจริงก็คือในบริบทนี้ไม่จำเป็นต้องมีอุปกรณ์พิเศษ มันอาจจะสันนิษฐานได้ง่าย ๆ ว่าเมื่อเรากำลังเปรียบเทียบบางสิ่งกับ a NULLเราหมายถึงว่าเรากำลังเปรียบเทียบค่ากับ 'มีNULLค่า' ไม่ใช่ค่าที่เป็น "ค่าที่ไม่ได้ระบุว่าการ underlaying NULLนั้นมี แต่เราไม่รู้ "ซึ่งเห็นได้ชัดว่าเราไม่สามารถรู้ได้ นั่นจะทำให้สิ่งต่าง ๆ ง่ายขึ้น
Pere

@ ก่อนหน้านี้ฉันจะไม่พูดว่ามัน“ ไร้สาระ” อย่างเคร่งครัดและฉันไม่แน่ใจว่าการเขียนIS NULLนั้นยากกว่าการเขียน= NULLมากนัก ฉันคิดว่ามันจะสอดคล้องกันมากขึ้นหากWHERE columnA = columnBมีการตีความแบบเดียวกันWHERE columnA = NULLมากกว่าจะถือว่าเป็นกรณีพิเศษ โปรดจำไว้ว่าNULLเป็นไม่ได้ค่า ในการเขียนโปรแกรมภาษาที่มันเป็นถูกต้องตามกฎหมายในการทดสอบvariable == nullก็คงเป็นเพราะnullมีความหมายที่แตกต่างกัน มันไม่ได้เป็นตัวแทนของสิ่งที่ไม่รู้จัก แต่เป็นการรีเซ็ตค่าโดยเจตนา ไม่เช่นนั้นกับ SQL
Manngo

นั่นเป็นเหตุผลที่ฉันใส่มันระหว่างเครื่องหมายคำพูด @Mangoo;) (และ "ตรรกะ") อย่าโกรธฉัน ฉันกำลังพูดถึง "การใช้เหตุผล" ของ ANSI ไม่ใช่คำอธิบายของคุณ ฉันเห็นด้วยที่ไม่มีค่าใช้จ่ายระหว่างIS NULLและ=NULLในตัวอย่างล่าสุดของคุณ แต่ลองดูที่อันสุดท้ายของโฮเวอร์ ฉันเบื่อที่จะประสบกับมันซ้ำแล้วซ้ำอีกโดยไม่จำเป็นต้องทำอะไรมากมาย? การตรวจสอบเป็นพิเศษ ...
Pere

1

ฉันอยากจะแนะนำรหัสนี้ฉันทำเพื่อค้นหาว่ามีการเปลี่ยนแปลงในค่าเป็นค่า iใหม่และdเก่า (แม้ว่าคำสั่งไม่สำคัญ) สำหรับเรื่องนั้นการเปลี่ยนแปลงจากค่าเป็นโมฆะหรือในทางกลับกันคือการเปลี่ยนแปลง แต่จากโมฆะเป็นโมฆะไม่ได้ (แน่นอนจากมูลค่าเป็นค่าอื่นเป็นการเปลี่ยนแปลง แต่จากมูลค่าเป็นเหมือนกันไม่ใช่)

CREATE FUNCTION [dbo].[ufn_equal_with_nulls]
(
    @i sql_variant,
    @d sql_variant
)
RETURNS bit
AS
BEGIN
    DECLARE @in bit = 0, @dn bit = 0
    if @i is null set @in = 1
    if @d is null set @dn = 1

    if @in <> @dn
        return 0

    if @in = 1 and @dn = 1
        return 1

    if @in = 0 and @dn = 0 and @i = @d
        return 1

    return 0

END

ในการใช้ฟังก์ชั่นนี้คุณสามารถ

declare @tmp table (a int, b int)
insert into @tmp values
(1,1),
(1,2),
(1,null),
(null,1),
(null,null)

---- in select ----
select *, [dbo].[ufn_equal_with_nulls](a,b) as [=] from @tmp

---- where equal ----
select *,'equal' as [Predicate] from @tmp where  [dbo].[ufn_equal_with_nulls](a,b) = 1

---- where not equal ----
select *,'not equal' as [Predicate] from @tmp where  [dbo].[ufn_equal_with_nulls](a,b) = 0

ผลลัพธ์ที่ได้คือ:

---- in select ----
a   b   =
1   1   1
1   2   0
1   NULL    0
NULL    1   0
NULL    NULL    1

---- where equal ----
1   1   equal
NULL    NULL    equal

---- where not equal ----
1   2   not equal
1   NULL    not equal
NULL    1   not equal

การใช้ sql_variant ทำให้สามารถใช้งานได้หลากหลายประเภท


0

NULL ไม่ใช่อะไรเลย ... ไม่เป็นที่รู้จัก ค่า NULL ไม่เท่ากัน นั่นคือเหตุผลที่คุณต้องใช้วลีมหัศจรรย์ IS NULL แทน = NULL ในคิวรี SQL ของคุณ

คุณสามารถอ้างถึงสิ่งนี้: http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.