使用存储过程我有一个相当复杂的SQL语句,它返回一个COUNT值作为伪列。在许多情况下,结果将为“null”。这会导致我的应用程序出现问题,所以我想知道默认情况下是否可以从存储过程中将'null'返回为'0'?
感谢。
更新
我需要将ISNULL应用于以下语句;
select recip_Chosen, recip_CampaignId) AS ChosenCount
from TBL_CAMPAIGNRECIPIENTS
WHERE recip_CampaignId = @campaign
group by recip_Chosen
应该是类似的东西;
select recip_Chosen, ISNULL(count(recip_CampaignId),0) AS ChosenCount
from TBL_CAMPAIGNRECIPIENTS
WHERE recip_CampaignId = @campaign
group by recip_Chosen
但是,这仍然会在ChosenCount列中返回null。有什么想法吗?
更新
好的,所以上面的陈述是一个更大的陈述的一部分,如下所示。这是完整的存储过程,但不是表结构,因为它涉及多个表。我只需要'ChosenCount'来返回'0'而不是Null。 SP确实为TBL_CAMPAIGNS_CHARITIES中的每条记录返回1行,其中它对应于TBL_CAMPAIGNS。
CREATE PROCEDURE web.getPublicCampaignData
(
@campaign BIGINT
)
AS
BEGIN
SELECT *
FROM TBL_CAMPAIGNS C
INNER JOIN TBL_MEMBERS M
ON C.campaign_MemberId = M.members_Id
INNER JOIN TBL_CAMPAIGNS_CHARITIES CC
ON C.campaign_Key = CC.camchar_CampaignID
INNER JOIN TBL_CHARITIES CH
ON CC.camchar_CharityID = CH.cha_Key
LEFT OUTER JOIN (
select recip_Chosen, count(recip_CampaignId) as ChosenCount
from TBL_CAMPAIGNRECIPIENTS
WHERE recip_CampaignId = @campaign
group by recip_Chosen
) CRC
on CH.cha_Key = CRC.recip_Chosen
WHERE C.campaign_Key = @campaign;
END
答案 0 :(得分:10)
是:
RETURN ISNULL(yourvalue, 0)
这基本上意味着什么:
如果“yourvalue”(计算值或@variable的值)为NOT NULL,则返回该值
如果“yourvalue”为空,则返回第二个参数(此处为“0”)而不是
我不知道你如何计算你的计数 - 我假设你将它分配给你的存储过程中的一些局部变量:
CREATE PROCEDURE dbo.DoMyCount()
RETURNS INT
AS BEGIN
DECLARE @MyCountVariable INT
SET @MyCountVariable = SELECT COUNT(*)......... -- whatever you do here
RETURN ISNULL(@MyCountVariable, 0)
END
在这种情况下,您的存储过程dbo.DoMyCount
将返回一个计数(但是您计算了该计数),或者“0”(零)是计数结果为NULL。
这样,您可以确保始终从存储过程中获取有效的NON-NULL INT值。
马克
更新:
存储过程清楚地说明了为什么ISNULL不起作用 - 它在LEFT OUTER JOIN中使用。如果没有数据匹配,那么LEFT OUTER JOIN内的整个select将永远不会被调用 - > ISNULL永远不会有机会完成它的工作。
您需要重新构建存储过程:
CREATE PROCEDURE web.getPublicCampaignData(@campaign BIGINT)
AS BEGIN
SELECT
(list of fields), ISNULL(CRC.ChosenCount, 0), .....
FROM TBL_CAMPAIGNS C
INNER JOIN TBL_MEMBERS M
ON C.campaign_MemberId = M.members_Id
INNER JOIN TBL_CAMPAIGNS_CHARITIES CC
ON C.campaign_Key = CC.camchar_CampaignID
INNER JOIN TBL_CHARITIES CH
ON CC.camchar_CharityID = CH.cha_Key
LEFT OUTER JOIN (
select recip_Chosen, count(recip_CampaignId) as ChosenCount
from TBL_CAMPAIGNRECIPIENTS
WHERE recip_CampaignId = @campaign
group by recip_Chosen
) CRC on CH.cha_Key = CRC.recip_Chosen
WHERE
C.campaign_Key = @campaign;
END
这样,如果CH.cha_Key = CRC.recip_Chosen
不匹配且LEFT OUTER JOIN返回NULL,它将被捕获并且ChosenCount = NULL将变为“0”。
答案 1 :(得分:5)
除了SQL Server上的isnull
之外,我是coalesce
的忠实拥护者,因为它需要任意数量的参数。对于两个参数,它在功能上等同于isnull
:
return coalesce(yourvalue, 0)
与:
相同return isnull(yourvalue, 0)
然而,
coalesce(yourvalue, backupval, 0)
相当于
isnull(isnull(yourvalue, backupval), 0)
显然,coalesce
在这种情况下更具可读性,所以这就是我成为粉丝的原因。
在一个非常简单的问题上为一个冗长的答案道歉,但是,嘿,为什么不学习别的东西,是吗?
答案 2 :(得分:2)
select isnull(sum(size),0) as total_size from my_table where is_valid = 1
答案 3 :(得分:2)
ISNULL可能更快,它特定于SQLServer。
COALESCE是ANSI标准
Here's some differences and other explanations about ISNULL and COALESCE