2011-10-04 81 views
1

我有一塊正在打擊一些空記錄的MySQL,如何將它設置爲返回0如果爲NULL? 謝謝!如果爲NULL,則返回零

嘗試這樣:

sprintf(queryString, "SELECT COUNT(*) FROM tblURLIP 
    WHERE IP = '%s' AND IPStatus = '1' AND IPMax  = '0' 
     AND IPType ='3'", ipSrc); 

沒有工作:

sprintf(queryString, "SELECT COUNT(*) FROM tblURLIP 
      WHERE IP = '%s' AND IPStatus = '1' AND IPMax = '0' 
      AND IPType ='3'", ipSrc,NULL),0); 
+1

'COUNT(*)'應該返回0如果沒有匹配的行。你從哪裏得到'NULL'? –

+0

因爲我在lsniff.exe的0x57088ce4處得到未處理的異常:0xC0000005:訪問衝突讀取位置0x00000000。 –

回答

4

您通常可以換東西,在一個coalesce function它給你的第一個非空值返回NULL:

select coalesce (some-nullable-thing, 0) from ... 

但是,count()應該從來沒有返回NULL。如果沒有滿足條款的記錄,則應該返回0.

如果您的問題不在於SQL,而是由於ipSrc本身爲NULL,那麼在處理它之前使用sprintf。要將NULL轉換爲0並保持其他所有內容不變,可以使用類似於:

sprintf (queryString, 
    "SELECT COUNT(*) FROM tblURLIP" 
    " WHERE IP = '%s'" 
    " AND IPStatus = '1'" 
    " AND IPMax = '0'" 
    " AND IPType ='3'", 
    (ipSrc == NULL) ? "0" : ipSrc); // <-- conversion happens here. 

這似乎是您想要的行爲。

+0

對不起,我不清楚,我只是想它返回0,如果我得到一個空回。我不是在尋找NULL。感謝您的合作,將用於未來的參考。謝謝。 –

1

你發佈的代碼片段是純C(顯然是爲SQL建立了一個查詢字符串,但是這裏沒有完成SQL,只是建立了一個字符串)。

我對你的問題的唯一解釋對我有意義,有時ipSrc是NULL,有時它指向一個有效的字符串。

假如是這樣的話,我認爲這會做什麼,我想你是問:

sprintf(queryString, "SELECT COUNT(*) FROM tblURLIP 
    WHERE IP = '%s' AND IPStatus = '1' AND IPMax  = '0' 
     AND IPType ='3'", ipSrc == 0 ? "0" : ipSrc); 

的關鍵部分是? :操作組合。如果這太模糊C爲了您的舒適,您也可以這樣做:

if (ipSrc == 0) // instead of 0 you can use NULL if that better suits your style 
    ipSrc = "0"; 
sprintf(queryString, "SELECT COUNT(*) FROM tblURLIP 
     WHERE IP = '%s' AND IPStatus = '1' AND IPMax  = '0' 
      AND IPType ='3'", ipSrc); 
+0

謝謝丹尼爾,我現在試試它。它似乎工作正常。 –

+0

糟糕,我的第二個例子(在分配給ipSrc)中出現了一個錯誤,現在已編輯修復 –

相關問題