Kiểm tra trường trống với MySQL


100

Tôi đã viết một truy vấn để kiểm tra người dùng với các tiêu chí nhất định, một là họ có địa chỉ email.

Trang web của chúng tôi sẽ cho phép người dùng có hoặc không có địa chỉ email.

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

Đây có phải là cách tốt nhất để kiểm tra trường trống trong SQL không? Tôi vừa thử "IS NOT NULL" và điều này vẫn trả về bản ghi người dùng mà họ không có địa chỉ email.

Truy vấn ở trên hoạt động nhưng vì tò mò, tôi tự hỏi liệu mình có đang thực hiện đúng cách không.

php  sql  mysql  null 

Câu trả lời:


274

Trường trống có thể là một chuỗi trống hoặc một NULL.

Để xử lý cả hai, hãy sử dụng:

email > ''

có thể được hưởng lợi từ rangequyền truy cập nếu bạn có nhiều bản ghi email trống (cả hai loại) trong bảng của mình.


11
Nghịch đảo của điều này là gì? (Đối với khi bạn muốn chỉ NULL hoặc '' lĩnh vực)
Keylan

1
@Keylan: không có biểu thức duy nhất.
Quassnoi

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

3
@SEoF: cái này sẽ không khớpNULL
Quassnoi

2
Tôi có nhận xét tương tự như của Quassnoi. Tôi phát hành "chọn orig_id, đường dây nóng từ normal_1952 nơi (đường dây nóng> '')!" Và có một kỷ lục với null đường dây nóng nhưng nó không match.I'm sử dụng MySQL 5.6
Scott Chu

38

Vâng, những gì bạn đang làm là chính xác. Bạn đang kiểm tra để đảm bảo trường email không phải là một chuỗi trống. NULL có nghĩa là dữ liệu bị thiếu. Chuỗi trống ""là một chuỗi trống có độ dài bằng 0.

Bạn cũng có thể thêm kiểm tra null

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

1
Biểu thức của bạn cũng sẽ khớp với các chuỗi trống. OR email IS NOT NULLlà thừa ở đây (nó được ngụ ý bởi điều kiện trước đó).
Quassnoi

1
Thật thú vị, điều này vẫn trả về các bản ghi có một emailtrường trống .

13
OR phải là AND ở đây. "HOẶC email KHÔNG
ĐẦY ĐỦ

Lưu ý nhận xét của pdavis "HOẶC NÊN VÀ"
người mới bắt đầu vào

13

Bạn đã có thể sử dụng

IFNULL(email, '') > ''

2
Tuyệt quá! Và bạn không cần TRIM. Để đảo ngược, hãy sử dụng IFNULL (email, '') = ''.
mauromartini

2

Có sự khác biệt giữa chuỗi rỗng (email! = "") Và NULL. NULL là null và một chuỗi rỗng là một cái gì đó.


Đó là lý do tại sao AND (email! = "" HOẶC email KHÔNG ĐỦ) không thành công?

3
nên đượcAND (email != '' AND email IS NOT NULL)
thetaiko

@thetaiko: email IS NOT NULLở đây là thừa. !=vị từ sẽ không bao giờ khớp với một NULLgiá trị.
Quassnoi

điều gì sẽ xảy ra nếu bạn thử: AND (trim (email)! = '')
Leslie

Tôi biết mình khá muộn trong cuộc thảo luận này, nhưng câu lệnh sẽ hoạt động nếu bạn đảo ngược thứ tự: "AND ((email KHÔNG ĐỦ) VÀ (email! = '')). Nếu được đánh giá theo thứ tự khác, câu lệnh sẽ đánh giá là null (không phải TRUE) nếu địa chỉ email là NULL, và do đó sẽ không phải là TRUE hoặc FALSE. Vì vậy, kiểm tra LÀ NULL phải đến ĐẦU TIÊN!
Curt

2

Điều này sẽ hoạt động nhưng vẫn có khả năng trả về bản ghi null. Mặc dù bạn có thể đang đặt địa chỉ email thành một chuỗi có độ dài bằng 0 khi chèn bản ghi, bạn vẫn có thể muốn xử lý trường hợp địa chỉ email NULL xâm nhập vào hệ thống bằng cách nào đó.

     $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
     ');

Truy vấn của @ op không để lại khả năng NULLtrả về bản ghi.
Quassnoi


-3

kiểm tra mã này cho sự cố:

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

        }
    }
}

Có nhiều cách tốt hơn để làm điều này trong truy vấn mà không cần phải lặp qua mỗi hàng duy nhất
Jiho Kang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.