如果为NULL则返回零

时间:2011-10-04 05:42:16

标签: mysql windows visual-c++

我有一块MySQL正在点击一些空记录,如果为NULL,如何将其设置为返回0? 谢谢!

试过这个:

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); 

2 个答案:

答案 0 :(得分: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.

这似乎是你想要的行为。

答案 1 :(得分: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);