这更像是一个评论而不是一个答案。请参阅 RRK 关于NULLIF
不是有效的 ColdFusion 功能和ISNULL()
隐藏错误的答案。
我的评论更多的是关于您的操作逻辑。您不需要执行您的某些步骤<CFELSE>
原来的:
<cfif AE_C NEQ 0>
<cfset AE_P=AE_T/AE_C>
<cfset AE_A=AE/AE_C*100>
<cfset AE_B = AE-AE_C/H8*H9>
<cfset AE_D=AE/H9*H8>
<cfelse>
<cfset AE_P=ISNULL(AE_T/NULLIF(AE_C))>
<cfset AE_A=ISNULL(AE/NULLIF(AE_C*100))>
<cfset AE_B=ISNULL(AE-AE_C/NULLIF(H8*H9))>
<cfset AE_D=ISNULL(AE/NULLIF(H9*H8))>
</cfif>
我假设您正在使用NULLIF()
来防止divide by zero
错误。
首先,在我熟悉的语言中,NULLIF()
需要两个参数:NULLIF(a,b)
如果a
不等于b
,则返回a
,否则返回NULL
。
也就是说,你cfif
说如果AE_C
不是0
那么做x,否则做y。我假设它应该是<cfset AE_P=ISNULL(AE_T/NULLIF(AE_C,0))>
。如果你推断出来,你会得到AE_T/NULLIF(0,0)
== AE_T/NULL
== NULL
。因此,您可以将该块短路并设置AE_P=NULL
. 但是你也有ISNULL()
围绕它的功能,所以这也总是正确的。并且ISNULL()
(在 ColdFusion 中除外)也需要 2 个参数。在 CF 中,它返回TRUE
/ FALSE
(或YES
/NO
是迂腐的)。所以现在你基本上已经完成了<cfset AE_P = YES/TRUE>
。我猜这不是你的初衷。所以ISNULL()
这里可能不合适。在 SQL 中,ISNULL(a,b)
这意味着 if a
is NULL
, return b
。所以(在 SQL 中)你基本上可以做AE_P = ISNULL(x,0)
这意味着如果AE_C
是0
,而不是得到divide by zero
错误,你可以设置AE_P = 0
。
TLDR;ColdFusion中没有NULLIF()
函数,因此如果您想防止div0
错误,您必须在 SQL 中执行此操作或修改您的 ColdFusion 集:
<cfif AE_C NEQ 0>
<cfset AE_P=AE_T/AE_C>
<cfset AE_A=AE/AE_C*100>
<cfelse>
<cfset AE_P=0>
<cfset AE_A=0>
</cfif>
我不知道您的代码流程,所以我不知道如何H8
以及H9
受其影响AE_C
,因此您可能还需要检查这些0
。
但是,我仍然会回到我通常的信念,如果这些计算是在 SQL 中使用而不是在代码中使用,那么它们应该在 SQL 中完成,而不是传递给应用服务器,然后再传回 SQL。不过,我不知道您的代码在做什么,因此在代码中包含这些计算可能更合适。