如果为NULL,则返回零

如果为NULL,则返回零

问题描述:

我有一块正在打击一些空记录的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。 –

您通常可以换东西,在一个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。感谢您的合作,将用于未来的参考。谢谢。 –

你发布的代码片段是纯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)中出现了一个错误,现在已编辑修复 –