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