Nullif-在Coldfusion中使用

时间:2018-08-03 11:17:16

标签: coldfusion nullif

在此代码方面寻求一些帮助。在无需发布整个文件的情况下,我只需要一点帮助就可以在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>

希望它可以通过这种方式完成。

3 个答案:

答案 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。同样,尽管我不知道您的代码在做什么,所以在代码中包含这些计算可能更合适。