使用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中的空字段的最佳方法吗?我刚刚尝试过“ IS NOT NULL”,但仍然返回用户记录,而他们没有电子邮件地址。

上面的查询有效,但出于好奇,我想知道自己是否以正确的方式进行操作。

php  sql  mysql  null 

Answers:


274

空字段可以是空字符串或NULL

要处理这两种情况,请使用:

email > ''

range如果表中有很多空电子邮件记录(两种类型),则可以从访问中受益。


11
这是什么反面?(适用于只需要NULL或''字段的情况)
Keylan 2012年

1
@Keylan:没有单个表达式。
Quassnoi 2012年

5
@Keylan:!(电子邮件>)
SEoF 2013年

3
@SEoF:这不匹配NULL
Quassnoi

2
我和Quassnoi的评论一样。我发出“ select normal_id,hotline from normal_1952 where!(hotline>'')”,并且有一条记录的热线为空,但不匹配。我使用的是MySQL 5.6
Scott Chu

38

是的,您所做的是正确的。您正在检查以确保电子邮件字段不是空字符串。NULL表示数据丢失。空字符串""是长度为0的空白字符串。

您也可以添加空检查

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

1
您的表达式也将匹配空字符串。OR email IS NOT NULL这里是多余的(以前的条件暗含)。
Quassnoi

1
有趣的是,它仍然返回具有空email字段的记录。

13
OR在这里应该是AND。“或电子邮件不为空”将匹配长度为0的空白电子邮件字符串
。– pdavis 2010年

通知pdavis评论“或应该和”
初学者


2

空字符串(电子邮件!=“”)和NULL之间是有区别的。NULL为空,而Empty字符串则为空。


这是为什么AND(电子邮件!=“”或电子邮件不为空)失败的原因?

3
应该是AND (email != '' AND email IS NOT NULL)
thetaiko 2010年

@thetaiko:email IS NOT NULL这里多余。!=谓词永远不会匹配NULL值。
Quassnoi

如果尝试尝试该怎么办:AND(trim(email)!=))
Leslie

我知道我的讨论还不算很晚,但是如果您颠倒顺序,该语句将起作用:“ AND((电子邮件不为空)AND(电子邮件!=”))。如果以其他顺序求值,则如果电子邮件地址为NULL,则该语句的求值为空(非TRUE),因此不会为TRUE或FALSE。因此,必须先进行IS NULL检查!
Curt

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 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.