MySQL SELECT ไม่เพียง แต่ค่า Null


264

เป็นไปได้หรือไม่ที่จะเลือก statement ที่รับเฉพาะค่า NULL เท่านั้น?

ตอนนี้ฉันกำลังใช้สิ่งนี้:

SELECT * FROM table

จากนั้นฉันต้องกรองค่าว่างด้วย php loop

มีวิธีการอย่างไร:

SELECT * (that are NOT NULL) FROM table

?

ตอนนี้เมื่อฉันเลือก * ฉันได้รับ val1, val2, val3, null, val4, val5, null, null ฯลฯ .... แต่ฉันต้องการรับค่าที่ไม่เป็นโมฆะในผลลัพธ์ของฉัน เป็นไปได้โดยไม่ต้องกรองด้วยห่วงหรือไม่


2
คุณต้องการเกิดอะไรขึ้นถ้ามีแถวที่บางคอลัมน์มีค่า NULL และคอลัมน์อื่นไม่มีค่า NULL
Mark Byers

ฉันต้องการรับค่าจากคอลัมน์ที่ไม่ใช่ค่า null เท่านั้นและคืนค่าคอลัมน์ในแถวที่ไม่ใช่ค่า null เท่านั้น ตอนนี้ฉันใช้การวนซ้ำเพื่อกรองพวกมันออกไปได้ไหม
bryan sammon

1
@bryan - โครงสร้างตารางของคุณคืออะไร? คอลัมน์ทั้งหมดมีประเภทข้อมูลเดียวกันหรือไม่
Martin Smith

1
@bryan - ชุดผลลัพธ์ในอุดมคติของคุณจะเป็นอย่างไร ชุดผลลัพธ์หนึ่งคอลัมน์มีค่าที่ไม่เป็นศูนย์ทั้งหมดหรือไม่ หากไม่แก้ไขคำถามของคุณด้วยข้อมูลตัวอย่างและผลลัพธ์ที่ต้องการจะเป็นประโยชน์ ...
Martin Smith

2
@bryan - ดูเหมือนว่าตารางของคุณอาจมีกลุ่มที่ซ้ำกันในคอลัมน์หรือไม่ (ดูบทความวิกิพีเดียสำหรับคำอธิบายและโครงสร้างทางเลือกที่แนะนำหากเป็นกรณีen.wikipedia.org/wiki/First_normal_form )
Martin Smith

คำตอบ:


452

IS NOT NULLคุณควรใช้ (ตัวดำเนินการเปรียบเทียบ=และ<>ทั้งสองให้UNKNOWNกับNULLด้านใดด้านหนึ่งของการแสดงออก)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

เพื่อความสมบูรณ์ฉันจะพูดถึงว่าใน MySQL คุณยังสามารถปฏิเสธตัวดำเนินการความเท่าเทียมกันของnull ที่ปลอดภัยได้แต่นี่ไม่ใช่ SQL มาตรฐาน

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

แก้ไขเพื่อสะท้อนความคิดเห็น ดูเหมือนว่าตารางของคุณอาจไม่อยู่ในรูปแบบปกติครั้งแรกซึ่งในกรณีนี้การเปลี่ยนโครงสร้างอาจทำให้งานของคุณง่ายขึ้น อีกสองวิธีในการทำแม้ว่า ...

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

ข้อเสียของข้างต้นคือมันสแกนตารางหลาย ๆ ครั้งสำหรับแต่ละคอลัมน์ ที่อาจหลีกเลี่ยงโดยด้านล่าง แต่ฉันไม่ได้ทดสอบใน MySQL

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/

2
ขอบคุณมาก .. มันช่วย :)
DfrDkn

ในวิธีการล่าสุดคุณใช้CASEคำสั่งไม่ใช่CASEฟังก์ชัน ดังนั้นมันไม่ควรจะเป็นEND CASEแทนที่จะEND เป็นSELECT CASE ...ส่วนหนึ่ง?
Istiaque Ahmed

สำหรับคนที่ไม่ชำนาญคุณสามารถอธิบายวิธีแก้ปัญหาล่าสุดได้ไหม ที่ไม่idx รอมคนแรกที่SELECTมาจากidxในครั้งที่สองSELECT? อะไรCASEลองคำสั่งให้สำเร็จ? ที่สองSELECTทำอะไรได้จริง? และคุณกำลังเข้าร่วมภายในไม่ใช่เข้าร่วมไขว้ใช่มั้ย
Istiaque Ahmed

ฉันไม่คิดว่านี่จะตอบคำถามได้ ฟังดูเหมือน OP ต้องการเลือก (ฉันถือว่ามีแถวหนึ่งแถว) แต่แยกคอลัมน์ทั้งหมดออกจากผลลัพธ์ที่เป็นโมฆะ - คำตอบนี้ต้องการให้คุณระบุว่าคอลัมน์ใดที่ไม่ได้รับอนุญาตให้เป็นโมฆะ (ซึ่งเป็นปัญหาที่แตกต่างอย่างสิ้นเชิง) หรือ ระบุคอลัมน์ทั้งหมดไม่เหมาะสำหรับตารางที่มีหลายคอลัมน์
csey

(เช่นบางสิ่งบางอย่างตามแนวSELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

คุณสามารถกรองแถวที่มีค่า NULL ในคอลัมน์ที่ระบุ:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

หากคุณต้องการกรองแถวที่มีค่า null ในคอลัมน์ใด ๆ ให้ลองทำดังนี้:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

อัปเดต: ตามความคิดเห็นของคุณคุณอาจต้องการสิ่งนี้หรือไม่

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

และฉันยินดีกับ Martin ว่าถ้าคุณต้องการทำสิ่งนี้คุณควรเปลี่ยนการออกแบบฐานข้อมูลของคุณ


ฉันไม่แน่ใจว่าฉันอธิบายได้ดีพอ แต่ฉันจะลองดีกว่านี้หน่อย ตอนนี้เมื่อฉันเลือก * ฉันได้รับ val1, val2, val3, null, val4, val5, null, null ฯลฯ .... แต่ฉันต้องการรับค่าที่ไม่เป็นโมฆะในผลลัพธ์ของฉัน เป็นไปได้โดยไม่ต้องกรองด้วยห่วงหรือไม่
bryan sammon

@bryan - คุณช่วยอธิบายว่าคอลัมน์*ใดส่งคืนได้บ้าง อาจให้ข้อมูลตัวอย่างเล็กน้อยในคำถามของคุณเนื่องจากไม่ชัดเจนจากความคิดเห็นของคุณด้านบนว่าเป็นคอลัมน์ทั้งหมดหรือไม่
Martin Smith

ตอนนี้ * คืนค่าทั้งหมดของฉันในแถว เช่น val1, val2, val3, null, val4, val5, null, null แต่ฉันต้องการให้ส่งคืนค่าคอลัมน์ที่ไม่ใช่ null เท่านั้น ตอนนี้ฉันทำกับลูปเพื่อกรองค่าหลังจากที่ส่งคืนผลลัพธ์
bryan sammon

13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

ข้อเสียเพียงอย่างเดียวของวิธีนี้คือคุณสามารถเปรียบเทียบได้เพียง 5 คอลัมน์หลังจากนั้นผลลัพธ์จะเป็นเท็จเสมอดังนั้นฉันจะเปรียบเทียบเฉพาะฟิลด์ที่สามารถเป็นNULLได้


8

ฉันพบวิธีแก้ปัญหานี้:

แบบสอบถามนี้เลือกค่าไม่ใช่ค่า null สุดท้ายสำหรับแต่ละคอลัมน์

ตัวอย่าง


หากคุณมีตาราง:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

คุณได้รับ:

title|body
t3   |b2

สอบถาม


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

ฉันหวังว่าจะช่วยคุณ


GROUP_CONCAT (body) AS body
Ravindra Singh

2

ฉันใช้\!คำสั่งภายใน MySQL เพื่อ grep out ค่า NULL จากเปลือก:

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

มันทำงานได้ดีที่สุดเมื่อมีการระบุ.my.cnfฐานข้อมูลชื่อผู้ใช้ / รหัสผ่าน วิธีการที่คุณเพียงแค่ต้องล้อมรอบของคุณselectด้วยและ\! mysql e| grep -v NULL


1

แบบสอบถามต่อไปนี้ทำงานให้ฉัน

เมื่อฉันได้ตั้งค่าเริ่มต้นของคอลัมน์ 'NULL' แล้ว

select * from table where column IS NOT NULL

และเมื่อฉันได้ตั้งค่าเริ่มต้นแล้วไม่มีอะไร

select * from table where column <>''


0

MySQL ไม่เป็นโมฆะเมื่อเข้าร่วมและเลือกแทรกเข้าไปลบและตัวดำเนินการทางตรรกะเช่นหรือไม่

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;

-4
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';

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