使用 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 检查空字段的主要内容,如果未能解决你的问题,请参考以下文章