如果我将以下值插入表格
Insert into Table1 (Field1, Field2, Field3, Field4, DateField) values (1, 1, 100, 5, "5/10/2012")
Insert into Table1 (Field1, Field2, Field3, Field4, DateField) values (1, 2, 100, 99, "5/10/2012")
Insert into Table1 (Field1, Field2, Field3, Field4, DateField) values (1, 3, 100, 3, "5/10/2012")
我的查询将尝试获取的是Field4中的值,其中Field2在特定日期的最大值。
实施例
select isnull(Field4,0) from Table1
where Field1 = 1 and Field3 = 100 and datediff(day,DateField,"5/21/2012") > 0
having Max(Field2) = Field2
哪个效果很好。我得到3是预期的。现在这是我的问题所在。 Field3可能有其他值,例如110.当我运行该查询时
select isnull(Field4,0) from Table1
where Field1 = 1 and Field3 = 110 and datediff(day,DateField,"5/21/2012") > 0
having Max(Field2) = Field2
我没有得到任何结果。它应该为null,然后isnull(Field4,0)应该吐出0.但它不会。我已经尝试用count(*)替换选择以查看它是否返回0,但它不会返回任何内容。我不知所措。我需要它返回0,因为这将进入临时表,然后用另一个表中的值汇总。感谢。
编辑 - 新问题部分 我知道我可能一直在使用isnull来处理错误的事情。哪个我能接受。但是,如果我想编写一个case语句来处理没有返回的内容,那么如果没有返回任何行,它就不会返回0。
select count(*) from Table1
where Field1 = 1 and Field3 = 110 and datediff(day,DateField,"5/21/2012") > 0
having Max(Field2) = Field2
上面的代码没有返回任何内容,而是像我认为的那样返回0。
答案 0 :(得分:1)
您没有得到任何结果,因为您插入的3条记录中没有一条对Field3有110条。因此,查询不返回任何行。只有在代替5,99或3时,才会使用ISNULL
,而对于返回的行,这些值为NULL
。
如果此记录在您的表格中:
INSERT INTO Table1 (Field1, Field2, Field3, Field4, DateField)
VALUES(1, 3, 110, NULL, "5/10/2012")
此记录符合您的Field3 = 110
要求,然后由SELECT逻辑设置为Field4 Null,但由于它不是,查询不会返回任何内容。
第2部分
HAVING
似乎正在从结果集中删除0
记录,因为在WHERE
子句之后没有记录与HAVING
条件匹配。< / p>
如果您想查看是否有符合条件的结果,可以使用EXISTS子句
IF EXISTS(
SELECT COUNT(*)
FROM Table1 AS t
WHERE t.Field1 = 1
AND t.Field3 = 110
AND DATEDIFF(day, t.DateField, "5/21/2012") > 0
HAVING MAX(Field2) = Field2
)
BEGIN
--Code for when the record Exists
END
ELSE
BEGIN
--No records logic here
END