【问题标题】:Checking for an empty field with MySQL使用 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”,这仍然返回了一个用户记录,而他们没有电子邮件地址。

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

【问题讨论】:

    标签: php sql mysql 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>";     
      
              }
          }
      }
      

      【讨论】:

      • 有更好的方法在查询中做到这一点,而不必遍历每一行
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2016-10-09
      相关资源
      最近更新 更多