Memeriksa bidang kosong dengan MySQL

100

Saya telah menulis kueri untuk memeriksa pengguna dengan kriteria tertentu, salah satunya adalah mereka memiliki alamat email.

Situs kami akan memungkinkan pengguna memiliki atau tidak memiliki alamat email.

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

Apakah ini cara terbaik untuk memeriksa kolom kosong di SQL? Saya baru saja mencoba "IS NOT NULL" dan ini masih mengembalikan catatan pengguna tanpa mereka memiliki alamat email.

Kueri di atas berfungsi tetapi karena penasaran saya bertanya-tanya apakah saya melakukannya dengan cara yang benar.


sumber

Jawaban:

274

Bidang kosong bisa berupa string kosong atau a NULL.

Untuk menangani keduanya, gunakan:

email > ''

yang bisa mendapatkan keuntungan dari rangeakses jika Anda memiliki banyak catatan email kosong (kedua jenis) di tabel Anda.

Quassnoi
sumber
11
Apa kebalikan dari ini? (Untuk saat Anda hanya menginginkan bidang NULL atau '')
Keylan
1
@Klan: tidak ada ekspresi tunggal.
Quassnoi
5
@Keylan:! (Email> '')
SEoF
3
@ SEoF: ini tidak akan cocokNULL
Quassnoi
2
Saya memiliki komentar yang sama dengan Quassnoi. Saya mengeluarkan "pilih orig_id, hotline dari normal_1952 di mana! (Hotline> '')" dan ada satu catatan dengan hotline null tetapi tidak cocok. Saya menggunakan MySQL 5.6
Scott Chu
38

Ya, apa yang Anda lakukan itu benar. Anda memeriksa untuk memastikan bidang email bukan string kosong. NULL berarti datanya hilang. String kosong ""adalah string kosong dengan panjang 0.

Anda juga dapat menambahkan pemeriksaan null

AND (email != "" OR email IS NOT NULL)
Yada
sumber
1
Ekspresi Anda juga akan cocok dengan string kosong. OR email IS NOT NULLdi sini mubazir (tersirat oleh kondisi sebelumnya).
Quassnoi
1
Menariknya, ini masih mengembalikan rekaman yang memiliki emailbidang kosong .
13
ATAU harus berupa DAN di sini. "OR email IS NOT NULL" akan cocok dengan string email kosong dengan panjang 0.
pdavis
Perhatikan komentar pdavis "ATAU HARUS DAN"
pemula
13

Anda bisa menggunakan

IFNULL(email, '') > ''
Mathieu de Lorimier
sumber
2
Bagus! Dan Anda tidak membutuhkan PANGKAS. Untuk membalik, gunakan IFNULL (email, '') = ''.
mauromartini
2

Ada perbedaan antara string kosong (email! = "") Dan NULL. NULL adalah null dan string Kosong adalah sesuatu.

Leslie
sumber
Yang mana mengapa AND (email! = "" OR email IS NOT NULL) gagal?
3
harusAND (email != '' AND email IS NOT NULL)
thetaiko
@thetaiko: di email IS NOT NULLsini mubazir. !=predikat tidak akan pernah cocok dengan NULLnilai.
Quassnoi
bagaimana jika Anda mencoba: AND (trim (email)! = '')
Leslie
Saya tahu saya agak terlambat untuk diskusi ini, tetapi pernyataan tersebut akan berhasil jika Anda membalik urutannya: "AND ((email IS NOT NULL) AND (email! = '')). Jika dievaluasi dalam urutan lain, pernyataan dievaluasi sebagai null (bukan TRUE) jika alamat emailnya NULL, dan dengan demikian tidak akan menjadi TRUE atau FALSE. Jadi pemeriksaan IS NULL harus dilakukan PERTAMA!
Curt
2

Ini akan berfungsi tetapi masih ada kemungkinan catatan nol dikembalikan. Meskipun Anda mungkin menyetel alamat email ke string dengan panjang nol saat Anda memasukkan data, Anda mungkin masih ingin menangani kasus alamat email NULL yang masuk ke sistem.

     $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
     ');
pdavis
sumber
Kueri @ op tidak memberikan kemungkinan NULLrekaman dikembalikan.
Quassnoi
-3

periksa kode ini untuk masalah:

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

        }
    }
}
pengguna3103831
sumber
Ada cara yang lebih baik untuk melakukan ini dalam kueri tanpa harus mengulang setiap baris
Jiho Kang