Проверка пустого поля с помощью 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

Пустое поле может быть пустой строкой или NULL.

Чтобы справиться с обоими, используйте:

email > ''

который может извлечь выгоду из rangeдоступа, если в вашей таблице много пустых записей электронной почты (обоих типов).


11
Что обратное? (Если вам нужны только поля NULL или '')
Кейлан,

1
@Keylan: нет единого выражения.
Quassnoi

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

3
@SEoF: это не будет совпадатьNULL
Quassnoi

2
У меня такой же комментарий, что и у Квассного. Я выдаю «выберите orig_id, горячая линия из normal_1952 где! (Горячая линия> '')», и есть одна запись с нулевой горячей линией, но она не совпадает. Я использую MySQL 5.6
Скотт Чу

38

Да, то, что вы делаете, правильно. Вы проверяете, не является ли поле электронной почты пустой строкой. NULL означает, что данные отсутствуют. Пустая строка ""- это пустая строка длиной 0.

Вы также можете добавить нулевую проверку

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

1
Ваше выражение также будет соответствовать пустым строкам. OR email IS NOT NULLздесь является избыточным (это подразумевается предыдущим условием).
Quassnoi

1
Интересно, что при этом по-прежнему возвращаются записи с пустым emailполем.

13
Здесь OR должно быть AND. «OR email IS NOT NULL» будет соответствовать пустой строке электронного письма длиной 0.
pdavis

Обратите внимание на комментарий pdavis «ИЛИ ДОЛЖНО БЫТЬ И»
новичок


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)! = '')
Лесли,

Я знаю, что я довольно поздно к этому обсуждению, но утверждение будет работать, если вы измените порядок: «И ((электронная почта НЕ ПУСТОЙ) И (электронная почта! = '')). При оценке в другом порядке оператор будет иметь значение NULL (не ИСТИНА), если адрес электронной почты равен NULL, и, следовательно, не будет ни ИСТИНА, ни ЛОЖЬ. Таким образом, проверка IS NULL должна идти ПЕРВЫМ!
Курт

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


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

        }
    }
}

Есть более эффективные способы сделать это в запросе без необходимости перебирать каждую отдельную строку
Джихо Канг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.