Проверка пустого поля с помощью 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", и это все равно вернуло запись пользователя без адреса электронной почты.

Вышеупомянутый запрос работает, но из любопытства я подумал, правильно ли я это делаю.


источник

Ответы:

274

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

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

email > ''

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

Quassnoi
источник
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 «ИЛИ ДОЛЖНО БЫТЬ И»
новичок
13

Вы могли бы использовать

IFNULL(email, '') > ''
Матье де Лоримье
источник
2
Большой! И вам не нужна ОТДЕЛКА. Чтобы инвертировать, используйте 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)! = '')
Лесли,
Я знаю, что я довольно поздно к этому обсуждению, но утверждение будет работать, если вы измените порядок: «И ((электронная почта НЕ ПУСТОЙ) И (электронная почта! = '')). При оценке в другом порядке оператор будет иметь значение 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
     ');
pdavis
источник
Запрос @ 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>";     

        }
    }
}
rahulcs754
источник
Есть более эффективные способы сделать это в запросе без необходимости перебирать каждую отдельную строку
Джихо Канг