MySQL ile boş bir alan kontrol ediliyor


101

E-posta adresleri olan belirli kriterlere sahip kullanıcıları kontrol etmek için bir sorgu yazdım.

Sitemiz, bir kullanıcının bir e-posta adresine sahip olmasına veya olmamasına izin verecektir.

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

SQL'de boş bir alanı kontrol etmenin en iyi yolu bu mu? "IS NOT NULL" ı denedim ve bu hala bir e-posta adresi olmadan bir kullanıcı kaydı döndürdü.

Yukarıdaki sorgu işe yarıyor, ancak meraktan dolayı doğru şekilde yapıp yapmadığımı merak ettim.

php  sql  mysql  null 

Yanıtlar:


274

Boş bir alan, boş bir dize veya bir NULL.

İkisini birden ele almak için şunu kullanın:

email > ''

rangeTablonuzda çok sayıda boş e-posta kaydınız (her iki tür) varsa erişimden faydalanabilir .


11
Bunun tersi nedir? (Sadece NULL veya '' alanları istediğinizde)
Keylan

1
@Keylan: tek bir ifade yok.
Quassnoi

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

3
@SEoF: Bu eşleşmeyecekNULL
Quassnoi

2
Quassnoi ile aynı yorumu yapıyorum. "Select orig_id, hotline from normal_1952 where! (Hotline> '')" yayınlıyorum ve boş yardım hattına sahip bir kayıt var ama eşleşmiyor. MySQL 5.6 kullanıyorum
Scott Chu

38

Evet, yaptığınız doğru. E-posta alanının boş bir dize olmadığından emin olmak için kontrol ediyorsunuz. NULL, verilerin eksik olduğu anlamına gelir. Boş dize "", 0 uzunluğunda boş bir dizedir.

Boş kontrolü de ekleyebilirsiniz.

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

1
İfadeniz boş dizelerle de eşleşecektir. OR email IS NOT NULLburada gereksizdir (önceki koşul tarafından ima edilmektedir).
Quassnoi

1
İlginçtir, bu yine de boş emailalanı olan kayıtları döndürür .

13
Ameliyathane burada bir AND olmalıdır. "VEYA e-posta BOŞ DEĞİL", 0 uzunluğunda boş bir e-posta dizesiyle eşleşecektir.
pdavis

Pdavis yorumuna dikkat edin "YA DA VE OLMALI"
başlangıç ​​seviyesi


2

Boş bir dize (email! = "") İle NULL arasında bir fark vardır. NULL null ve Boş dizge bir şeydir.


AND (e-posta! = "" VEYA e-posta BOŞ DEĞİL) neden bu yüzden başarısız oluyor?

3
olmalıdırAND (email != '' AND email IS NOT NULL)
thetaiko

@thetaiko: email IS NOT NULLburada gereksizdir. !=yüklem hiçbir zaman bir NULLdeğerle eşleşmez .
Quassnoi

ya denerseniz: AND (trim (email)! = '')
Leslie

Bu tartışmaya oldukça geç kaldığımı biliyorum, ancak sıralamayı tersine çevirirseniz ifade işe yarayacaktır: "VE ((e-posta BOŞ DEĞİL) VE (e-posta! = '')). Diğer sırada değerlendirilirse, e-posta adresi NULL ise ifade boş (DOĞRU değil) olarak değerlendirilir ve bu nedenle DOĞRU veya YANLIŞ olmaz. Yani IS NULL kontrolü ÖNCE gelmelidir!
Curt

2

Bu işe yarayacaktır, ancak yine de boş bir kaydın döndürülme olasılığı vardır. Kaydı eklediğinizde e-posta adresini sıfır uzunluğunda bir dizeye ayarlıyor olsanız da, yine de sisteme bir şekilde giren bir NULL e-posta adresinin durumunu ele almak isteyebilirsiniz.

     $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 sorgusu, NULLdöndürülen kayıt olasılığını bırakmaz.
Quassnoi


-3

sorun için bu kodu kontrol edin:

$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>";     

        }
    }
}

Bunu her satırda döngü yapmak zorunda kalmadan sorguda yapmanın daha iyi yolları var
Jiho Kang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.