DIVIDE_BY_ZERO错误类

SQLSTATE: 22012

除零。使用try_divide容忍除数为0,返回NULL。如果必要的设置<设置>“假”绕过这个错误。

参数

  • ansiConfig:配置的名称改变行为。

解释

砖提出这个错误当它试图分裂间隔,或数字0。这个错误隔离对象提供的上下文信息和表达错误发生。函数和运算符等国防部,这可能会导致这个错误包括那些执行部门作为更复杂的公式的一部分。

缓解

错误的减排取决于原因:

  • 导致错误的表达是正确的吗?

    如果表达式是错误的修复它0价值不能发生,重新查询。

  • 数据是否正确?

    如果输入数据应该能够导致0值传递,你可能需要解决数据在源或清洗前的数据传递给函数作为参数。

    数据清理可能意味着排除违法的行,将0值到使用nullif (expr, 0),或者将数据转换为另一个可接受的使用价值如果(expr = 0, alt, expr)

如果表达式和数据是正确的,你想除零容忍,你可以使用try_divide。作为一种替代方法,改变参数nullif (expr, 0)。这将会导致表达式返回而不是一个错误。如果你喜欢你可以问题nvl (try_divide (expr1 expr2)、alt)将生成的到另一个值,如中性元素0或乘法1

最后的解决方案,当表达式或数据流不能更改,您可以禁用这个ANSI行为通过设置ansiconfig。请注意,此设置重要的非即时错误条件

例子

——DIVIDE_BY_ZERO嵌入视图。上下文信息隔离fai函数。>创建取代临时视图v(c1)作为选择1/瓦尔(1),(0)作为T(瓦尔);>选择c1v;(DIVIDE_BY_ZERO]部门通过返回而不是,使用try_divide如果必要的“spark.sql.ansi.enabled”(除了ANSI时间间隔类型)绕过错误= =SQL视图v(1,位置7)= =选择1/瓦尔(1),(0)作为T(瓦尔)^ ^ ^ ^ ^——由零容忍部门通过将使用try_divide结果为NULL。>创建取代临时视图v(c1)作为选择try_divide(1,瓦尔)(1),(0)作为T(瓦尔);>选择c1v;1——由零容忍部门通过将使用nullif结果为NULL>创建取代临时视图v(c1)作为选择1/nullif(瓦尔,0)(1),(0)作为T(瓦尔);>选择c1v;1——行过滤攻势>创建取代临时视图v(c1)作为选择1/瓦尔(1),(0)作为T(瓦尔)在哪里瓦尔! =0;>选择c1v;1——除零变成了除一个小数目。>创建取代临时视图v(c1)作为选择1/如果(瓦尔=0,1e- - - - - -10,瓦尔)(1),(0)作为T(瓦尔);>选择c1v;110000000000——把除零变成中性元素。>创建取代临时视图v(c1)作为选择nvl(try_divide(1,瓦尔),0)(1),(0)作为T(瓦尔);>选择c1v;10——禁用ANSI SQL模式数据砖为视图定义。>ANSI_MODE=;>创建取代临时视图v(c1)作为选择1/瓦尔(1),(0)作为T(瓦尔);>ANSI_MODE=真正的;>选择c1v;1——禁用砖ANSI模式运行时视图定义。>火花sqlansi启用=;>创建取代临时视图v(c1)作为选择1/瓦尔(1),(0)作为T(瓦尔);>火花sqlansi启用=真正的;>选择c1v;1