这更像是一个评论而不是一个答案。请参阅 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 ais 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。不过,我不知道您的代码在做什么,因此在代码中包含这些计算可能更合适。