sql查询使用having子句,没有结果不返回null

时间:2012-06-28 16:44:55

标签: sql sybase aggregate-functions

如果我将以下值插入表格

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。

1 个答案:

答案 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