DAX从入门到精通 2-4-3 拦截错误
目前为止,你以及看到了可能发生的好几种的错误,接下来,你可以开始学习如何阻止错误,如何修正,至少返回一个稍微有意义的结果。DAX中的表达式的错误,很大程度依赖数据源表格的值以及所引用的列。因此,你要空值这些错误产生的条件,以及返回的错误信息。
首先介绍的是iferror函数,有点类似于if函数,但是他不是判断一个布尔值的条件,他判断的是一个表达式返回的结果是否是错误。你可以看到两种使用iferror的函数。
= IFERROR ( Sales[Quantity] * Sales[Price], BLANK () )
= IFERROR ( SQRT ( Test[Omega] ), BLANK () )
第一个表达式中,只要其中一个的值无法转换为数字,那么表达式就返回空。否者则返回数量和价格的乘积。
第二个表达式中,只要Test[Omega]包含了负值,那就会返回空值。
使用iferror的另一种更普遍的方式式使用iserror和if两个函数结合。
= IF (
ISERROR ( Sales[Quantity] * Sales[Price] ),
BLANK (),
Sales[Quantity] * Sales[Price]
)
=
IF (
ISERROR ( SQRT ( Test[Omega] ) ),
BLANK (),
SQRT ( Test[Omega] )
)
当检测错误的同时,返回的是同一个表达式的值,那么你可以是用iferror,你不必重复写同一个表达式,这样有助于提升可读性。而当你需要返回不同表达式结果时,你就要使用if了。例如,你要判断SQRT函数是否正确,当提供的参数时正数时候,就正确计算,提供负数的时候,就返回blank。
if函数的第三个参数默认值为blank,所以上面的公式也可以这样写:
另一个重要的检测函数是isblank。isblank函数检测表达式是否为空,如果是空值,返回True。某些时候,当空值和0所表达的意义不一样的时候,这个函数尤其重要。下面的例子,我们计算交易的运输费用,如果交易没有特别指明重量,则使用默认的邮寄费用。
如果我们只是简单的把重量*单价,那么对于那些没有重量值的交易记录,邮寄费用就会为0.
尽量避免使用错误处理函数
虽然现在讨论DAX代码优化还为时尚早,但是你应该要注意到,使用错误处理函数可能会对计算效率表现产生影响。不是因为他们自身速度慢,而是因为,当错误发生的时候,DAX引擎不能使用其自身的优化性能方式。大多数情况下,更有效率的方式是对可能发生的错误进行操作,而不是使用错误处理函数。举例如下。
= IFERROR (
SQRT ( Test[Omega] ),
BLANK ()
)
推荐的写法为:
= IF (
Test[Omega] >= 0,
SQRT ( Test[Omega] ),
BLANK ()
)
第二个表达式不用检测是否发生错误,其运行速度比之前的块。当然,这个只是个通常情况下,详细的用法,我们在后面“优化DAX”会介绍