如何在SQL中包含“无”值的“无”语句

时间:2013-01-28 20:12:10

标签: sql sql-server

我有一个SQL脚本,告诉我我的员工是否有任何在过去48小时内未更新的开放服务订单。它看起来像这样(简化) -

select ServiceOrder, RepName from NotesTable

join OrdersTable on OrdersTable.OrderNumber=NotesTable.OrderNumber

having (DATEDIFF(day,max(NotesTable.LastModified),GETDATE()) >2)

基本上只需要今天的日期,减去最近一次音符的最后修改日期,并吐出48小时内未修改的服务订单数量。

我的问题是,如果服务订单有 no 注释,则此脚本不起作用。因此即使它在48小时内没有更新,它也没有出现在报告中。什么样的“或”我需要说“还告诉我它是否没有笔记。”

我考虑加入另一个包含“dateopened”字段的表,然后

OR (DATEDIFF(day,(NotesTable.DateOpened),GETDATE()) >2)

但是会返回超过48小时的每个服务订单,因此无效。

思想?

4 个答案:

答案 0 :(得分:3)

实际上,您仍然缺少部分查询(例如GROUP BY),但这可以让您了解自己想要的内容:

SELECT ServiceOrder, RepName 
FROM OrdersTable 
LEFT JOIN NotesTable
    ON OrdersTable.OrderNumber = NotesTable.OrderNumber
GROUP BY ServiceOrder, RepName 
HAVING (DATEDIFF(DAY,MAX(NotesTable.LastModified),GETDATE()) >2)
OR MAX(NotesTable.LastModified) IS NULL

答案 1 :(得分:2)

如果[Orders]表中的每条记录默认都有[NotesTable]记录,那么这将起作用。

将[NoteTable]。[LastModified]更改为Isnull([NotesTable]。[LastModified],[NoteTable]。[DateOpened])...
这将使用“LastModified”(如果它存在),如果不存在则将使用“DateOpened”。

答案 2 :(得分:0)

您需要包含与其相关的其他表格。也许这是订单表?希望该表有一些字段来指示它上次修改的时间。

    select ServiceOrder, RepName from Orders
    left outer join NotesTable
    on Orders.OrderID = NotesTable.OrderID


    having (DATEDIFF(day,max(Coalesce(NotesTable.LastModified,
       Orders.LastModified)),GETDATE()) >2)

您可能需要使用案例陈述而不是Coalesce来查看哪个LastModified日期更新。

答案 3 :(得分:-1)

您可以使用ISNULL(http://msdn.microsoft.com/en-us/library/ms184325.aspx

select ServiceOrder, RepName 
from NotesTable
having (DATEDIFF(day,max(ISNULL(NotesTable.LastModified,NotesTable.DateOpened )),GETDATE()) >2)