กำลังตรวจสอบช่องว่างด้วย MySQL


101

ฉันได้เขียนข้อความค้นหาเพื่อตรวจสอบผู้ใช้ที่มีเกณฑ์บางอย่างคือพวกเขามีที่อยู่อีเมล

ไซต์ของเราจะอนุญาตให้ผู้ใช้มีหรือไม่มีที่อยู่อีเมล

$aUsers=$this->readToArray('
 SELECT `userID` 
 FROM `users` 
 WHERE `userID` 
 IN(SELECT `userID`
         FROM `users_indvSettings`
  WHERE `indvSettingID`=5 AND `optionID`='.$time.')
  AND `email`!=""
 ');

นี่เป็นวิธีที่ดีที่สุดในการตรวจสอบช่องว่างใน SQL หรือไม่ ฉันเพิ่งลอง "IS NOT NULL" และสิ่งนี้ยังคงส่งคืนบันทึกผู้ใช้โดยที่พวกเขาไม่มีที่อยู่อีเมล

ข้อความค้นหาข้างต้นใช้งานได้ แต่ด้วยความอยากรู้อยากเห็นฉันสงสัยว่าฉันกำลังทำอย่างถูกต้องหรือไม่

php  sql  mysql  null 

คำตอบ:


274

ฟิลด์ว่างอาจเป็นสตริงว่างหรือ a NULL.

ในการจัดการทั้งสองอย่างให้ใช้:

email > ''

ซึ่งจะได้รับประโยชน์จากการrangeเข้าถึงหากคุณมีบันทึกอีเมลว่างเปล่าจำนวนมาก (ทั้งสองประเภท) ในตารางของคุณ


11
ผกผันของสิ่งนี้คืออะไร? (สำหรับเมื่อคุณต้องการเฉพาะฟิลด์ NULL หรือ '')
Keylan

1
@ Keylan: ไม่มีการแสดงออกเดียว
Quassnoi

5
@Keylan:! (email> '')
SEoF

3
@SEoF: สิ่งนี้จะไม่ตรงกันNULL
Quassnoi

2
ฉันมีความคิดเห็นเหมือนกับของ Quassnoi ฉันออก "เลือก orig_id สายด่วนจาก normal_1952 โดยที่! (สายด่วน> '')" และมีบันทึกหนึ่งรายการที่มีสายด่วนว่าง แต่ไม่ตรงกันฉันใช้ MySQL 5.6
Scott Chu

38

ใช่สิ่งที่คุณกำลังทำนั้นถูกต้อง คุณกำลังตรวจสอบว่าฟิลด์อีเมลไม่ใช่สตริงว่างเปล่า NULL หมายถึงข้อมูลหายไป สตริงว่าง""คือสตริงว่างที่มีความยาว 0

คุณสามารถเพิ่มการตรวจสอบค่าว่างได้ด้วย

AND (email != "" OR email IS NOT NULL)

1
นิพจน์ของคุณจะตรงกับสตริงว่างเช่นกัน OR email IS NOT NULLซ้ำซ้อนที่นี่ (โดยนัยโดยเงื่อนไขก่อนหน้านี้)
Quassnoi

1
ที่น่าสนใจสิ่งนี้ยังคงส่งคืนระเบียนที่มีemailเขตข้อมูลว่างเปล่า

13
หรือควรเป็นและที่นี่ "หรืออีเมลไม่เป็นโมฆะ" จะจับคู่สตริงอีเมลว่างที่มีความยาวเป็น 0
pdavis

สังเกตความคิดเห็นของ pdavis "หรือควรเป็นและ"
เริ่มต้น

13

คุณสามารถใช้

IFNULL(email, '') > ''

2
เยี่ยมมาก! และคุณไม่จำเป็นต้องใช้ TRIM หากต้องการกลับด้านให้ใช้ IFNULL (email, '') = ''
mauromartini

2

มีความแตกต่างระหว่างสตริงว่าง (email! = "") และ NULL NULL เป็นโมฆะและสตริงว่างคือบางสิ่ง


ข้อใดคือสาเหตุที่ AND (email! = "" OR email IS NOT NULL) ล้มเหลว

3
ควรจะเป็นAND (email != '' AND email IS NOT NULL)
thetaiko

@thetaiko: email IS NOT NULLซ้ำซ้อนที่นี่ !=เพรดิเคตจะไม่ตรงกับNULLค่า
Quassnoi

จะเป็นอย่างไรถ้าคุณลอง: AND (trim (email)! = '')
Leslie

ฉันรู้ว่าฉันค่อนข้างจะสายสำหรับการสนทนานี้ แต่คำสั่งนี้จะใช้ได้ผลถ้าคุณกลับคำสั่ง: "AND ((อีเมลไม่เป็นโมฆะ) และ (อีเมล! = '')) หากประเมินตามลำดับอื่นคำสั่งจะประเมินว่าเป็นโมฆะ (ไม่ใช่ TRUE) หากที่อยู่อีเมลเป็นโมฆะดังนั้นจะไม่เป็น TRUE หรือ FALSE ดังนั้นการตรวจสอบ IS NULL ต้องมาก่อน!
Curt

2

วิธีนี้จะใช้งานได้ แต่ยังมีความเป็นไปได้ที่จะมีการส่งคืนเร็กคอร์ดว่าง แม้ว่าคุณอาจตั้งค่าที่อยู่อีเมลเป็นสตริงที่มีความยาวเป็นศูนย์เมื่อคุณแทรกบันทึก แต่คุณอาจต้องการจัดการกรณีที่ที่อยู่อีเมล NULL เข้าสู่ระบบอย่างใด

     $aUsers=$this->readToArray('
     SELECT `userID` 
     FROM `users` 
     WHERE `userID` 
     IN(SELECT `userID`
               FROM `users_indvSettings`
               WHERE `indvSettingID`=5 AND `optionID`='.$time.')
     AND `email` != "" AND `email` IS NOT NULL
     ');

การสืบค้นของ @ op ทำให้ไม่สามารถNULLส่งคืนบันทึก
Quassnoi

0

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

LIKE '%\ '

ตรวจสอบให้แน่ใจว่ามีช่องว่างหลังแบ็กสแลช ข้อมูลเพิ่มเติมที่นี่: http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html


-3

ตรวจสอบรหัสนี้สำหรับปัญหา:

$sql = "SELECT * FROM tablename WHERE condition";

$res = mysql_query($sql);

while ($row = mysql_fetch_assoc($res)) {

    foreach($row as $key => $field) {  

        echo "<br>";

        if(empty($row[$key])){

            echo $key." : empty field :"."<br>"; 

        }else{

        echo $key." =" . $field."<br>";     

        }
    }
}

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