簡體   English   中英

使用having子句的SQL查詢,沒有結果不返回null

[英]sql query using having clause with no results not returning null

如果我在表中插入以下值

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,因為這將進入一個臨時表,然后與另一個表中的值相加。 謝謝。

編輯-新問題部分據我了解,我可能在此處將notull用於錯誤的事情。 我可以接受的。 但是,如果我想編寫一個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。

您沒有得到任何結果,因為您插入的3條記錄中沒有一個具有Field3的110。 結果,該查詢不返回任何行。 ISNULL如果不是5,99,或3,這些價值觀將只用於NULL的返回行。

如果此記錄在您的表中:

INSERT INTO Table1 (Field1, Field2, Field3, Field4, DateField)
VALUES(1, 3, 110, NULL, "5/10/2012")

該記錄將符合您的Field3 = 110要求,然后具有Field4 Null(由SELECT邏輯設置為0),但由於沒有,因此查詢將不會返回任何內容。

第2部分

似乎HAVING正在從結果集中刪除0記錄,因為WHERE子句之后沒有剩余記錄可以與HAVING條件匹配。

如果要查看是否有任何符合條件的結果,可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM