有什么好方法可以避免在存储过程中多次编写isnull()函数吗?
我有一个存储过程,它使用isnull()函数将近30次,我想我遗漏了一个概念,但在找到更好的方法获取数据之前,我很乐意从这么多isnull()函数中清除代码。
我是否可以将Server 2008 R2设置为使用空值作为浮点数0?如果没有数据,我的大部分isnull()只是添加零值,这样我就可以做数学操作了。
编辑:我并不懒惰,我只是试图清理代码,避免选择如下所示的部件
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发布于 2013-04-26 14:26:43
不,无法告诉Server将所有空浮点值视为零。您必须用ISNULL()或者,更好的是IMHO,COALESCE()包围这些表达式。您可以在视图中这样做,这样就不必在每个查询中重复它。
发布于 2013-04-26 20:06:53
我有一个类似的查询,显示了大量的封装ISNULL语句。我需要空值来表示未被触摸的项(因为许多列都需要不同的更改标识符)。我尝试了无数种不同的方法来解决这个问题,最后却得到了一段长得令人讨厌的代码,其中包含了一堆ISNULLs。关于“长得令人讨厌的编码,加上一堆ISNULLs”的重要之处在于,它每次都对我来说是完美的。我建议仅仅找到一种模式来使用它们来清理代码的外观并使其在一般情况下更容易导航。
至于使用合并的建议,我不会建议它取决于您试图返回的记录的数量。我一遍又一遍地读到,合并可能会对性能造成影响,尽管有一些好处。
https://stackoverflow.com/questions/7408893/isnull-vs-coalesce http://www.sqlservercentral.com/Forums/Topic832742-392-5.aspx#bm1352397
发布于 2013-04-30 04:13:03
将isnulls转储到内部查询中,并在外部使用它们,可能是为了避免使用多个isnulls?
SELECT A
FROM (SELECT ISNULL (A, 0) FROM TABLEA) A
...https://dba.stackexchange.com/questions/41015
复制相似问题