ฉันกำลังทำงานกับโค้ดที่เขียนโดยนักพัฒนาคนก่อนหน้านี้
WHERE p.name <=> NULL
อะไร<=>
หมายถึงในแบบสอบถามนี้? มันเท่ากับ=
อะไรเหรอ? หรือเป็นข้อผิดพลาดทางไวยากรณ์หรือไม่
แต่จะไม่แสดงข้อผิดพลาดหรือข้อยกเว้น ผมรู้อยู่แล้วว่า<>
= !=
ในMySQL
ฉันกำลังทำงานกับโค้ดที่เขียนโดยนักพัฒนาคนก่อนหน้านี้
WHERE p.name <=> NULL
อะไร<=>
หมายถึงในแบบสอบถามนี้? มันเท่ากับ=
อะไรเหรอ? หรือเป็นข้อผิดพลาดทางไวยากรณ์หรือไม่
แต่จะไม่แสดงข้อผิดพลาดหรือข้อยกเว้น ผมรู้อยู่แล้วว่า<>
= !=
ในMySQL
คำตอบ:
มันเป็นโอเปอเรเตอร์ที่NULL
ปลอดภัย
เช่นเดียวกับ=
โอเปอเรเตอร์ปกติมีการเปรียบเทียบสองค่าและผลลัพธ์จะเป็น0
(ไม่เท่ากัน) หรือ1
(เท่ากัน) ในคำอื่น ๆ : 'a' <=> 'b'
อัตราผลตอบแทน0
และอัตราผลตอบแทน'a' <=> 'a'
1
ต่างจาก=
ผู้ปฏิบัติงานทั่วไปค่าที่NULL
ไม่มีความหมายพิเศษและดังนั้นจึงไม่เคยให้ผลลัพธ์NULL
ที่เป็นไปได้ ดังนั้น: 'a' <=> NULL
อัตราผลตอบแทน0
และอัตราผลตอบแทนNULL <=> NULL
1
สิ่งนี้มีประโยชน์เมื่อตัวถูกดำเนินการทั้งสองอาจมีNULL
และคุณต้องการผลลัพธ์การเปรียบเทียบที่สอดคล้องกันระหว่างสองคอลัมน์
การใช้งานอื่น ๆ พร้อมกับข้อความสั่งที่เตรียมไว้เช่น:
... WHERE col_a <=> ? ...
ที่นี่ตัวยึดตำแหน่งอาจเป็นค่าสเกลาร์หรือNULL
ไม่ต้องเปลี่ยนแปลงอะไรเกี่ยวกับแบบสอบถาม
นอกจากนี้<=>
ยังมีโอเปอเรเตอร์อีกสองตัวที่สามารถใช้เปรียบเทียบกับNULL
คือIS NULL
และIS NOT NULL
; พวกเขาเป็นส่วนหนึ่งของมาตรฐาน ANSI ดังนั้นจึงสนับสนุนในฐานข้อมูลอื่นซึ่งแตกต่างจาก<=>
ซึ่งเป็นเฉพาะ MySQL
คุณสามารถคิดว่ามันเป็นความเชี่ยวชาญของ MySQL <=>
:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
ด้วยเหตุนี้แบบสอบถามเฉพาะของคุณ (ส่วน) สามารถแปลงเป็นแบบพกพาได้มากขึ้น:
WHERE p.name IS NULL
มาตรฐาน SQL: 2003 ได้นำเสนอเพรดิเคตสำหรับสิ่งนี้ซึ่งทำงานเหมือนกับ<=>
ตัวดำเนินการของ MySQL ในรูปแบบต่อไปนี้:
IS [NOT] DISTINCT FROM
ต่อไปนี้ได้รับการสนับสนุนในระดับสากล แต่มีความซับซ้อนเชิงสัมพันธ์:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1
<=>
คือผู้ประกอบการที่ไร้ประโยชน์หรือไม่ ขวา?
<=>
ใช้เวลาสองตัวถูกดำเนินการในขณะที่IS (NOT) NULL
ใช้เพียงหนึ่ง; ความแตกต่างใหญ่ ... มันมีประโยชน์เท่า ๆ กัน=
ในแง่นั้น
IS NULL
และIS NOT NULL
อยู่ในมาตรฐาน SQL <=>
เป็นส่วนเสริมเฉพาะของ MySQL
is not distinct from
ผู้ประกอบการ อยากรู้ว่าถ้า MySQL สามารถใช้ดัชนีบนที่ ...
a <=> b
NOT(a <=> b)
คือ<=> NULL-safe equal to operator
ตัวดำเนินการนี้ทำการเปรียบเทียบความเท่าเทียมกันเช่นตัวดำเนินการ = แต่คืนค่า 1 แทนที่จะเป็น NULL ถ้าตัวถูกดำเนินการทั้งคู่เป็น NULL และ 0 มากกว่า NULL ถ้าตัวถูกดำเนินการตัวหนึ่งเป็น NULL
ดูที่นี่สำหรับเอกสาร
ตัวอย่าง:
คุณควรใช้ไม่เป็นโมฆะ (ตัวดำเนินการเปรียบเทียบ = และ <> ทั้งสองให้ UNKNOWN กับ NULL ที่ด้านใดด้านหนึ่งของนิพจน์)
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
ยังสามารถปฏิเสธตัวดำเนินการความปลอดภัยของค่าว่างที่เป็นโมฆะ แต่นี่ไม่ใช่ SQL มาตรฐาน
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
เป็นค่า NULL ที่ปลอดภัยเท่ากับตัวดำเนินการ
<=> ผู้ประกอบการใช้ในการเปรียบเทียบค่า NULL กับเขตข้อมูล ถ้า normal = (เท่ากับ) ตัวดำเนินการคืนค่า NULL ถ้าหนึ่งในค่าการเปรียบเทียบคือ NULL ด้วย <=> โอเปอเรเตอร์คืนค่าจริงหรือเท็จ <=> ผู้ประกอบการเหมือนกับ IS NULL
จากคู่มือ: -
<=>
ทำการเปรียบเทียบความเท่าเทียมกันเช่นตัวดำเนินการ = แต่ส่งคืน 1 แทนที่จะเป็น NULL ถ้าตัวถูกดำเนินการทั้งสองเป็น NULL และ 0 แทนที่จะเป็น NULL ถ้าตัวถูกดำเนินการหนึ่งตัวเป็น NULL
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
แก้ไข: - ( แม้ว่าจะช้ามากที่จะเพิ่มบันทึกย่อด้านหนึ่งที่กล่าวถึงไม่ <=>เช่นกัน )
ในหมายเหตุด้าน: -
มีอีกหนึ่งจุดคือไม่ <=>ซึ่งใช้ในการเปรียบเทียบค่า NULL กับเขตข้อมูล ถ้า Normal! = หรือ <> (ไม่เท่ากับ) ตัวดำเนินการคืนค่า NULL ถ้าหนึ่งในค่าการเปรียบเทียบคือ NULL ด้วย NOT ที่ใช้กับ <=> โอเปอเรเตอร์จะคืนค่าจริงหรือเท็จ ไม่ใช้กับ <=> ตัวดำเนินการเหมือนกับ IS NULL
ตัวอย่าง:-
SELECT NULL != NULL, //--Result is NULL
NOT NULL <=> NULL, //--Result is 0
NULL IS NOT NULL; //--Result is 0
NOT <=>
ไม่ได้เป็นผู้ประกอบการก็นำไปใช้กับผลการNOT
op1 <=> op2
<!=>
ผู้ให้บริการ
<=>
MySQL ปลอดภัยเป็นโมฆะ "เท่ากับ" ตัวดำเนินการ จากคู่มือ :
ค่า NULL-safe เท่ากับ ตัวดำเนินการนี้ทำการเปรียบเทียบความเท่าเทียมกันเช่นตัวดำเนินการ = แต่คืนค่า 1 แทนที่จะเป็น NULL ถ้าตัวถูกดำเนินการทั้งคู่เป็น NULL และ 0 มากกว่า NULL ถ้าตัวถูกดำเนินการตัวหนึ่งเป็น NULL
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
ค่า NULL-safe เท่ากับ ตัวดำเนินการนี้ทำการเปรียบเทียบความเท่าเทียมกันเช่นตัวดำเนินการ = แต่คืนค่า 1 แทนที่จะเป็น NULL ถ้าตัวถูกดำเนินการทั้งคู่เป็น NULL และ 0 มากกว่า NULL ถ้าตัวถูกดำเนินการตัวหนึ่งเป็น NULL
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
มันสำคัญ:
เมื่อคุณเปรียบเทียบค่า NULL กับค่าที่ไม่ใช่ NULL คุณจะได้รับ NULL ถ้าคุณต้องการตรวจสอบว่าค่าเป็นโมฆะ
ตัวดำเนินการความเท่าเทียมกัน (<=>) ซึ่งถือว่า NULL เป็นค่าปกติดังนั้นจะส่งกลับ 1 (ไม่ใช่ NULL) หากค่าทั้งสองเป็น NULL และส่งกลับ 0 (ไม่ใช่ NULL) หากหนึ่งในค่านั้นเป็น NULL:
เช่น
SELECT NULL <=> NULL -- 1
SELECT TRUE <=> TRUE -- 1
SELECT col1 <=> col2 FROM myTable
<=>
เป็นผู้ประกอบการเท่ากับโมฆะปลอดภัย a <=> b
เหมือนกับการเขียน:
CASE
WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
WHEN a IS NULL OR b IS NULL THEN 0 -- one operand is null then 0
ELSE a = b -- else behave like normal = operator
END
และขออภัยฉันไม่พบเหตุผลที่ดีอย่างหนึ่งในการใช้โอเปอเรเตอร์นี้แทน AND/OR IS (NOT) NULL
และขอโทษฉันไม่สามารถหาเหตุผลหนึ่งที่ดีที่จะใช้ประกอบการแทนนี้ตัวอย่างของคุณตัวอย่างเช่นเป็นเช่นเดียวกับWHERE p.name <=> NULL
WHERE p.name IS NULL
จากเอกสาร MySQL :
ค่า NULL-safe เท่ากับ ตัวดำเนินการนี้ทำการเปรียบเทียบความเท่าเทียมกันเช่นตัวดำเนินการ = แต่คืนค่า 1 แทนที่จะเป็น NULL ถ้าตัวถูกดำเนินการทั้งคู่เป็น NULL และ 0 มากกว่า NULL ถ้าตัวถูกดำเนินการตัวหนึ่งเป็น NULL
ตัวอย่างการใช้<=>
โอเปอเรเตอร์จะเป็น:
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
ซึ่งจะกลับมา:
1, 1, 0
ตัวอย่างของ=
ผู้ประกอบการปกติจะเป็น:
SELECT 1 = 1, NULL = NULL, 1 = NULL;
ซึ่งจะกลับมา:
1, NULL, NULL
<=>
ผู้ประกอบการเป็นอย่างมากคล้ายกับ=
ผู้ประกอบการยกเว้น<=>
จะไม่กลับNULL
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids | id | ids |
+----+------+----+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 5 | 6 | 5 | 6 |
| 6 | 7 | 6 | 7 |
+----+------+----+------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids | id | ids |
+----+------+----+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 3 | NULL | 3 | NULL |
| 4 | NULL | 3 | NULL |
| 3 | NULL | 4 | NULL |
| 4 | NULL | 4 | NULL |
| 5 | 6 | 5 | 6 |
| 6 | 7 | 6 | 7 |
spaceship
ผู้ประกอบการ