在此代码方面寻求一些帮助。在无需发布整个文件的情况下,我只需要一点帮助就可以在Coldfusion中使用Nullif。
我可以在SQL语句中使用它,但是为了学习起见,我想知道在按如下所示设置变量时是否可以使用它:-
代码不会引发任何错误,但我想知道将0放在Nullif之后的位置。
<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>
希望它可以通过这种方式完成。
答案 0 :(得分:1)
重要:您的代码未显示任何错误,因为ISNULL
掩盖了该错误。
NULLIF
也不是有效的ColdFusion函数。我相信您的页面上没有错误的原因是,ColdFusion ISNULL()
函数似乎是一种非常通用的函数,并显示了一些未记录的特征。即使ISNULL()
在语法上有效,即使其中的表达式已定义也不会返回错误。
例如
ISNULL(AE_T/NULLIF(AE_C)) // No error because AE_T/NULLIF(AE_C) is a valid statement.
作为替代方案,您可以执行以下操作。
以下内容有些怪异,但您可以签出功能val()
。对于任何非数字的字符串,它将返回0(有关详细信息,请参阅文档)。
NULLIF(AE_C)
变成val(AE_C)
。
<cfset AE_P=ISNULL(AE_T/val(AE_C))>
如果val()
返回0
,则ISNULL()
的输出将为YES
,因为除以0
会引发错误。
答案 1 :(得分:1)
这是本·纳德尔(Ben Nadel)写的一些代码,我发现它可以解决该错误,也许有人可以帮我解决该错误,因为我实在无法理解。
<!---
Do SQL division with divide-by-zero protection. But this,
time, let's provide a default value if the division is
not valid.
--->
<cfquery name="qDivision" datasource="#REQUEST.DSN.Source#">
SELECT
(
ISNULL(
(45 / NULLIF( 0, 0 )),
0
)
) AS value
;
</cfquery>
<!--- Output resulting value. --->
[ #qDivision.value# ]
答案 2 :(得分:0)
这不是评论,而是答案。请参阅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
,它将返回{ {1}},否则将返回a
。
也就是说,您的NULL
说,如果cfif
不是AE_C
,则执行x,否则执行y。我假设它应该是0
。如果将其推断出来,将得到<cfset AE_P=ISNULL(AE_T/NULLIF(AE_C,0))>
== AE_T/NULLIF(0,0)
== AE_T/NULL
。因此,您可以短路该块并设置NULL
。但是您还可以使用AE_P=NULL
函数,因此这也将永远是正确的。 ISNULL()
(ColdFusion除外)也接受2个参数。在CF中,它返回ISNULL()
/ TRUE
(或FALSE
/ YES
成为书)。因此,现在您基本上完成了NO
。我猜那不是你的初衷。因此,<cfset AE_P = YES/TRUE>
在这里可能不合适。在SQL中,ISNULL()
表示如果ISNULL(a,b)
为a
,则返回NULL
。因此,(在SQL中)您基本上可以做b
,这意味着如果AE_P = ISNULL(x,0)
是AE_C
,而不是得到0
错误,您可以设置{{1 }}。
TLDR; ColdFusion中没有divide by zero
函数,因此,如果您想防止AE_P = 0
错误,则必须在SQL中进行操作或修改ColdFusion集:
NULLIF()
我不知道您的代码流程,所以我不知道div0
对<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
的影响,因此您可能需要检查{ {1}}。
但是,我仍然回到我通常的信念,即如果这些计算是在SQL中使用的,而不是真正在代码中使用的,那么它们应该在SQL中完成,而不是传递给应用服务器,然后再返回给SQL。同样,尽管我不知道您的代码在做什么,所以在代码中包含这些计算可能更合适。