有什么好的方法可以避免isnull()
在存储过程中多次编写函数吗?
我有一个使用该isnull()
函数几乎 30 次的存储过程,我认为我缺少一个概念,但在我找到更好的方法来获取我的数据之前,我会喜欢从这么多isnull()
函数中清理我的代码。
我可以将 SQL Server 2008 R2 设置为使用空值作为浮点 0 吗?isnull()
如果没有数据,我的大部分只是添加零 0 值,这样我就可以进行数学运算。
编辑:我并不懒惰,我只是想清理我的代码并避免选择部分看起来像这样
select
vrsta.NAZIV
,isnull(sum(prod.prod_mpci),0) as prod_MPCI
,isnull(sum(isnull(mal_MPCI,0) + (vel_kol * isnull(mal_MPC,vel_VPC))),0) as lager_mpci
,isnull(sum(vel_NCI),0)+isnulL(sum(mal_NCI),0) as lager_nci
,sum( case
when isnull(vel_KOL,0)+isnull(mal_KOL,0) > isnull(prod.prod_kol,0) and isnull(dzn.dzn,'2010-01-01') < @dzu
then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_MPC,vel_VPC)
else 0 end
) as visak_MPC
,sum( case
when isnull(vel_KOL,0)+isnull(mal_KOL,0) > isnull(prod.prod_kol,0) and isnull(dzn.dzn,'2010-01-01') < @dzu
then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_NC,vel_NC)
else 0 end
) as visak_MPC
,sum( case
when isnull(vel_KOL,0)+isnull(mal_KOL,0) <= isnull(prod.prod_kol,0)
then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_MPC,vel_VPC)
else 0 end
) as manjak_MPC
,sum( case
when isnull(vel_KOL,0)+isnull(mal_KOL,0) <= isnull(prod.prod_kol,0)
then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_NC,vel_NC)
else 0 end
) as manjak_NC
不,没有办法告诉 SQL Server 将所有 NULL 浮点值视为零。您将不得不用
ISNULL()
or 包围这些表达式,恕我直言,更好COALESCE()
。您可以在视图中执行此操作,因此您不必在每个查询中重复它。我有一个类似的查询显示大量封装 ISNULL 语句。我需要空值来表示尚未触及的项目(因为许多列需要不同的标识符来进行更改)。我尝试了一百万种不同的方法来解决它,最后只得到了一个带有一堆 ISNULL 的烦人的长代码。关于“带有一堆 ISNULL 的令人讨厌的长编码”的重要一点是,它每次都对我来说非常完美。我建议只是找到一种模式来使用它们来清理代码的外观并使其更容易导航。
至于使用 COALESCE 的建议,我不会根据您尝试返回的记录数量来建议它。我一遍又一遍地读到 COALESCE 会影响性能,尽管有一些好处。
https://stackoverflow.com/questions/7408893/isnull-vs-coalesce http://www.sqlservercentral.com/Forums/Topic832742-392-5.aspx#bm1352397
将 s转储
isnull
到内部查询中并在外部使用它们可能是为了避免多个isnull
s?