Перевірка порожнього поля за допомогою MySQL


100

Я написав запит, щоб перевірити користувачів із певними критеріями, один з них має адресу електронної пошти.

Наш сайт дозволить користувачеві мати або не мати електронної адреси.

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

Це найкращий спосіб перевірити наявність порожнього поля в SQL? Я щойно спробував "НЕ НУЛЬНИЙ", і це все одно повернуло запис користувачів, не маючи електронної адреси.

Наведений вище запит працює, але з цікавості я задумався, чи роблю це правильно.

php  sql  mysql  null 

Відповіді:


274

Порожнім полем може бути або порожній рядок, або a NULL.

Для обробки обох використовуйте:

email > ''

який може скористатися rangeдоступом, якщо у вашій таблиці багато порожніх записів електронної пошти (обох типів).


11
У чому тут обернено? (Бо коли потрібно лише поля NULL або '')
Keylan

1
@Keylan: жодного виразу немає.
Quassnoi

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

3
@SEoF: це не збігатиметьсяNULL
Quassnoi

2
У мене такий самий коментар, як у Quassnoi. Я видаю "select 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
АБО тут має бути І. "АБО електронна пошта НЕ НУЛЬНА" відповідатиме порожній рядку електронної пошти довжиною 0.
pdavis

Помітьте коментар pdavis "АБО БУДЕ ТАК"
початківець

13

Ви можете використовувати

IFNULL(email, '') > ''

2
Чудово! І вам не потрібно ТРИМ. Для інвертування використовуйте IFNULL (електронна пошта, '') = ''.
mauromartini

2

Існує різниця між порожнім рядком (email! = "") Та NULL. NULL - це нуль, а порожній рядок - це щось.


Через що І (електронна пошта! = "" АБО електронна пошта НЕ НУЛЬНА) не працює?

3
має бутиAND (email != '' AND email IS NOT NULL)
thetaiko

@thetaiko: email IS NOT NULLтут зайве . !=предикат ніколи не відповідає NULLзначенню.
Quassnoi

що робити, якщо спробувати: AND (обрізка (email)! = '')
Леслі,

Я знаю, що я запізнююсь із цією дискусією, але заява спрацює, якщо ви скасуєте порядок: "AND ((електронна пошта НЕ НУЛЬНИЙ) AND (email! = '')) Якщо оцінюється в іншому порядку, виписка визначається як нульова (не ІСТИННА), якщо адреса електронної пошти 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>";     

        }
    }
}

Є кращі способи зробити це за допомогою запиту, не переглядаючи кожен ряд
Jiho Kang,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.