使用 MySQL 检查空字段

Posted

技术标签:

【中文标题】使用 MySQL 检查空字段【英文标题】:Checking for an empty field with MySQL 【发布时间】:2011-01-20 14:04:16 【问题描述】:

我编写了一个查询来检查具有特定条件的用户,其中之一是他们有一个电子邮件地址。

我们的网站将允许用户拥有或不拥有电子邮件地址。

$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”,这仍然返回了一个用户记录,而他们没有电子邮件地址。

上面的查询有效,但出于好奇,我想知道我的做法是否正确。

【问题讨论】:

【参考方案1】:

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

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

email > ''

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

【讨论】:

这个的反面是什么? (当您只需要 NULL 或 '' 字段时) @Keylan:没有单一的表达方式。 @SEoF:这不匹配 NULL @Quassnoi - 如果“email > ''”同时匹配空值和 null 值,那么逆向只是简单地反转布尔值的输出,即“!(email > '')”作为" email > '' " 位首先被评估,然后结果被反转。除非你告诉我“email > ''”的答案是 true、false 或 null……那么是的,它不会起作用。 我和 Quassnoi 的评论相同。我发出“select orig_id,hotline from normal_1952 where !(hotline > '')”,并且有一条记录为空热线但它不匹配。我使用的是 mysql 5.6【参考方案2】:

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

您也可以添加空检查

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

【讨论】:

您的表达式也将匹配空字符串。 OR email IS NOT NULL 在这里是多余的(由前面的条件暗示)。 有趣,这仍然会返回具有空 email 字段的记录。 这里的 OR 应该是 AND。 "OR email IS NOT NULL" 将匹配长度为 0 的空白电子邮件字符串。 注意 pdavis 评论“OR SHOULD BE AND”【参考方案3】:

你可以使用

IFNULL(email, '') > ''

【讨论】:

太棒了!你不需要修剪。要反转,请使用 IFNULL(email, '') = ''。【参考方案4】:

空字符串(电子邮件!=“”)和 NULL 之间存在区别。 NULL 是 null,而 Empty 字符串是什么。

【讨论】:

这就是 AND (email != "" OR email IS NOT NULL) 失败的原因? 应该是AND (email != '' AND email IS NOT NULL) @thetaiko: email IS NOT NULL 在这里是多余的。 != 谓词永远不会匹配 NULL 值。 如果您尝试:AND (trim(email) != '') 我知道我在这个讨论中已经很晚了,但是如果你颠倒顺序,这个语句就会起作用:“AND ((email IS NOT NULL) AND (email != '')).如果以其他顺序评估,则如果电子邮件地址为 NULL,则该语句评估为 null(非 TRUE),因此既不是 TRUE 也不是 FALSE。所以必须先检查 IS NULL!【参考方案5】:

这可行,但仍有可能返回空记录。虽然您可能在插入记录时将电子邮件地址设置为长度为零的字符串,但您可能仍希望以某种方式处理 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 记录。【参考方案6】:

如果您想查找所有不为 NULL 且为空或有任意数量的空格的记录,这将起作用:

LIKE '%\ '

确保反斜杠后有一个空格。更多信息在这里:http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

【讨论】:

【参考方案7】:

检查此代码是否存在问题:

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

        
    

【讨论】:

有更好的方法在查询中做到这一点,而不必遍历每一行

以上是关于使用 MySQL 检查空字段的主要内容,如果未能解决你的问题,请参考以下文章

SQL 语句 把一个值为0的字段改为空('null')

怎样用SQL语句对指定字段建立非空约束?

MongoDB 检查 $switch 语句中的空字段

Postgres 检查空 JSONB 字段

如何检查datareader是空还是空

VBA 防止用户输入表单中出现空字段