MySQL: เลือกแถวที่คอลัมน์เป็นโมฆะ


270

ฉันมีปัญหาเมื่อฉันพยายามเลือกแถวที่มีค่า NULL สำหรับคอลัมน์ใดคอลัมน์หนึ่งมันจะส่งคืนชุดว่าง อย่างไรก็ตามเมื่อฉันดูตารางใน phpMyAdmin มันบอกว่าไม่มีค่าสำหรับแถวส่วนใหญ่

ข้อความค้นหาของฉันมีลักษณะเช่นนี้:

SELECT pid FROM planets WHERE userid = NULL

ตั้งค่าว่างทุกครั้ง

มีหลายสถานที่ที่บอกว่าต้องไม่เก็บเป็น "NULL" หรือ "null" แทนที่จะเป็นค่าจริงและมีคนบอกว่าให้ลองมองหาช่องว่าง ( userid = ' ') แต่ไม่มีสิ่งใดทำงานได้ มีข้อเสนอแนะที่จะไม่ใช้ MyISAM และใช้ innoDB เพราะ MyISAM มีปัญหาในการจัดเก็บที่ว่าง ฉันเปลี่ยนตารางเป็น innoDB แต่ตอนนี้ฉันรู้สึกว่าปัญหาอาจเป็นได้ว่ามันยังไม่เป็นจริงเพราะวิธีการแปลง ฉันต้องการทำสิ่งนี้โดยไม่ต้องสร้างตารางเป็น innoDB หรือสิ่งอื่นใด แต่ถ้าฉันต้องทำฉันสามารถลองได้อย่างแน่นอน


1
MyISAM ไม่มีปัญหาในการเก็บค่าว่าง ความหมายของ NULLs เองควรเป็นอิสระจากเครื่องยนต์
MarkR

คำตอบ:


512

SQL NULL พิเศษและคุณต้องทำ WHERE field IS NULLนั้นเนื่องจาก NULL ไม่สามารถเท่ากับอะไรก็ได้

รวมถึงตัวเอง (เช่น: NULL = NULL เป็นเท็จเสมอ)

ดูRule 3 https://en.wikipedia.org/wiki/Codd%27s_12_rules


24
มันไม่เป็นที่รู้จัก - ไม่ใช่เท็จ SQL ใช้ตรรกะที่มีค่าสามข้อ
Martin Smith

38
NULL = NULL ไม่ใช่ FALSE จริง - แต่เป็น NULL อีกครั้ง แต่มันไม่ใช่เรื่องจริงดังนั้นถ้า (NULL = NULL) จะไม่ดำเนินการ
Konerak

1
ดูเพิ่มเติมที่ @obe answer: SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0
โทมัส

ไม่เพียง แต่เป็นโมฆะไม่เท่ากับสิ่งใด ๆ เท่านั้น แต่ยังไม่เท่ากับสิ่งใดเลย กล่าวอีกนัยหนึ่งselect * from foo where bar <> "abc"จะไม่ส่งคืนแถวที่แถบนั้นเป็นโมฆะ นั่นทำให้ฉันวนวนในวันนี้ เอกสารเรียก<>ตัวดำเนินการ "ไม่เท่ากับ" แต่จริงๆแล้วมันคือ "เท่ากับสิ่งอื่นที่ไม่ใช่" ตัวดำเนินการ
StackOverthrow


39

เนื่องจากทั้งหมดได้รับคำตอบฉันต้องการเพิ่มอีกนิด ฉันยังต้องเผชิญกับปัญหาเดียวกัน

ทำไมการสืบค้นของคุณถึงล้มเหลว คุณมี,

SELECT pid FROM planets WHERE userid = NULL;

สิ่งนี้จะไม่ให้ผลลัพธ์ที่คาดหวังเพราะจากmysql doc

ใน SQL ค่า NULL ไม่เคยเป็นจริงเมื่อเปรียบเทียบกับค่าอื่น ๆ แม้แต่ NULL นิพจน์ที่มี NULL จะสร้างค่า NULL เสมอเว้นแต่จะระบุไว้เป็นอย่างอื่นในเอกสารประกอบการของตัวดำเนินการและฟังก์ชันที่เกี่ยวข้องกับนิพจน์

เน้นการขุด

เพื่อค้นหาค่าคอลัมน์ที่เป็นNULLคุณไม่สามารถใช้การexpr = NULLทดสอบ คำสั่งต่อไปนี้จะไม่ส่งคืนแถวเนื่องจากexpr = NULLจะไม่เป็นจริงสำหรับนิพจน์ใด ๆ

สารละลาย

SELECT pid FROM planets WHERE userid IS NULL; 

ในการทดสอบNULLใช้IS NULLและIS NOT NULLโอเปอเรเตอร์


17

นอกจากนี้ยังมี<=>โอเปอเรเตอร์:

SELECT pid FROM planets WHERE userid <=> NULL

จะทำงาน. สิ่งที่ดีคือ<=>สามารถใช้กับค่าที่ไม่ใช่ค่า NULL ได้:

SELECT NULL <=> NULL1อัตราผลตอบแทน

SELECT 42 <=> 42ให้ผลผลิต1เช่นกัน

ดูที่นี่: https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to


11

ข้อมูลจากhttp://w3schools.com/sql/sql_null_values.asp :

1) ค่า NULL แทนข้อมูลที่ไม่รู้จัก

2) โดยค่าเริ่มต้นคอลัมน์ตารางสามารถเก็บค่า NULL

3) ค่า NULL จะถือว่าแตกต่างจากค่าอื่น ๆ

4) ไม่สามารถเปรียบเทียบค่า NULL และ 0 ได้ พวกเขาไม่เทียบเท่า

5) ไม่สามารถทดสอบค่า NULL ด้วยตัวดำเนินการเปรียบเทียบเช่น =, <หรือ <>

6) เราจะต้องใช้ IS NULL และ IS NOT NULL โอเปอเรเตอร์แทน

ดังนั้นในกรณีที่ปัญหาของคุณ:

SELECT pid FROM planets WHERE userid IS NULL

7

มีปัญหาเดียวกันกับที่ค้นหา:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

ไม่ส่งคืนค่าใด ๆ ดูเหมือนว่าจะมีปัญหากับ MyISAM และแบบสอบถามเดียวกันกับข้อมูลใน InnoDB ส่งคืนผลลัพธ์ที่คาดหวัง

ไปด้วย:

SELECT * FROM 'column' WHERE 'column' = ' '; 

ส่งคืนผลลัพธ์ที่คาดหวังทั้งหมด



0

ฉันมีปัญหาเดียวกันเมื่อแปลงฐานข้อมูลจาก Access เป็น MySQL (ใช้ vb.net เพื่อสื่อสารกับฐานข้อมูล)

ฉันต้องการประเมินว่าฟิลด์ (ฟิลด์ประเภท varchar (1)) เป็นโมฆะหรือไม่

คำสั่งนี้ใช้ได้กับสถานการณ์ของฉัน:

SELECT * FROM [table name] WHERE [field name] = ''

1
หากวิธีนี้ใช้ได้ผลสำหรับคุณค่าเริ่มต้นสำหรับ varchar (1) ของคุณคือ '' แทนที่จะเป็นโมฆะดังนั้นจึงไม่เกี่ยวข้องกับคำถามนี้
さりげない告白
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.