2012-04-07 68 views
1

专家你好:我有一个表叫tblAlarm,它有一些记录是这样的:行为过滤空值

enter image description here

我有另一个表,确定哪些用户看到什么消息:

enter image description here

现在我想编写一个查询表明,如果消息didinot到期。(例如它的BeginYear和EndYear等等......之间一年)的用户还没有看到消息。我写这篇文章的查询:

SELECT * 
FROM 
tblAlarms LEFT OUTER JOIN tblUsersAlarms tua ON tblAlarms.Id=tua.MessageID 
WHERE @CurrentYear BETWEEN tblAlarms.BeginYear AND tblAlarms.EndYear 
    AND @CurrentMonth BETWEEN tblAlarms.BeginMonth AND tblAlarms.EndMonth 
    AND @CurrentDay BETWEEN tblAlarms.BeginDay AND tblAlarms.EndDay 
    AND @CurrentHour * 60 + @CurrentMinute BETWEEN tblAlarms.BeginHour*60 + tblAlarms.BeginMinute AND tblAlarms.EndHour*60 + tblAlarms.EndMinute 
    --AND (tua.UserID <> 128 AND tua.UserID IS NULL) 

,并返回:

enter image description here

,但如果我去掉最后一行它不返回任何record.How我可以确定用户还没有看到什么信息?

谢谢

回答

6

比较NULL和值的结果是UNKNOWN。筛选条件仅选择条件评估为TRUE的行,因此未选择条件评估为FALSE或UNKNOWN的行。

IS NULLIS NOT NULL测试是不同的,并且总是产生TRUE或FALSE答案。你也不能写column = NULL或​​(至少,SQL标准不允许这么做;一些SQL方言可能)。

你的条件是:

AND (tua.UserID <> 128 AND tua.UserID IS NULL) 
  • 如果tua.UserID值为NULL,则第二项的计算结果为TRUE,但随后的第一个将评估为未知的,未知的,真不明,这不是TRUE,所以该行未被选中。

  • 如果tua.UserID的值不为NULL,则第二项的计算结果为FALSE,因此总体条件计算结果为FALSE,因此未选择该行。

因此,当您添加条件时,没有任何内容会被选中,如您所观察的那样。

更典型的,您的情况是这两种的:

AND (tua.UserID <> 128 AND tua.UserID IS NOT NULL) 

AND (tua.UserID <> 128 OR tua.UserID IS NULL) 

在第一替代的双重条件,其实是多余的。如果tua.UserID为NULL,则第一项将评估为UNKNOWN,因此整体条件将不为TRUE,并且该行不会被选中。第二种选择非常有用。

+0

非常感谢,但你最后两个条件不符合我的条件 – Arian 2012-04-07 07:08:02

+3

它们是说明性的,而不是你的查询的答案。我不清楚你想做什么。我正在帮你学习如何钓鱼,而不是给你今天的鱼。 – 2012-04-07 07:44:39

0

NULL”表示:“我不知道价值”。这并不意味着:“没有任何价值”。因此,如果使用NULL值作为其参数之一执行比较,则结果可能为TRUEFALSE,具体取决于实际值(但未知)。但是UNKNOWN不是比较的有效结果,所以在这种情况下输出是FALSE

当你把一个比较运营商一样=!=<<=>>=,两个值(字段或文字)之间<>,这一个值是NULL,则是比较操作的结果是总是FALSE

NULL值有两种特殊的比较运算符,您已经使用过:IS NULLIS NOT NULL。两者不是二元运算符,而是一元运算符。这意味着,他们没有两个参数,但只有一个参数。他们测试它们的参数是否为NULL值。

因此,如果tua.UserIDNULLtua.UserID <> 128必须是FALSEtua.UserID IS NULL的其他部分是TRUE,但FALSE AND TRUEFALSE,并且这会为所有行生成完整的WHERE-条件FALSE

+0

-1 null不是一个值,它是“一个缺失值的标记,SQL不知道值为什么缺失 - 语义是[应用程序设计者]的工作”,所以它可能意味着“There can如果需要,不会有任何价值“。在SQL中,UNKNOWN确实是一个有效的比较结果。使用涉及空值的运算符进行比较并不总是评估FALSE。 – onedaywhen 2012-04-10 10:16:55