2015-08-26 20 views
1

我想解決這個問題,但無法獲取任何地方。SQL除以零錯誤,nullif沒有幫助

從我迄今爲止發現的情況來看,我認爲我需要對每個除數使用一個nullif子句,但是當我嘗試這樣做時,它仍然不起作用。

下面是沒有nullif的聲明,它產生零除誤差。

(1 - (1 - (x1.hup/(x1.hup/(x1.dp/100))))/(1 - (x2.sdp/100))) 
+2

如果'x2.sdp'是100呢?那麼你有'(1 - (100/100)',這是0,將成爲除數 – SomeJavaGuy

+1

如果我沒有弄錯,你的公式可以縮寫爲x1.dp /(100 - x2.sdp)。 x1.hup完全,你只需要檢查x2.sdp是否爲100。也許你在你的公式中犯了一個錯誤。 –

回答

2

可能有更簡單的方法來表達這一點。我想這是所有你需要:

(1 - (1 - (x1.hup/(x1.hup/nullif(x1.dp/100, 0))))/nullif(1 - (x2.sdp/100)), 0)) 
+1

'x1.hup'也可能爲零。我想知道表達式應該是什麼解決,因爲它看起來相當瘋狂:D – Luaan

+0

我開始認爲我的公式可能是問題..:)... x1.hup = 395.42,x1.dp = 50,x2.sdp = 10和答案我是尋找是44.44 ..... –

+0

@ S.Carter。 。 。也許你應該問一個關於樣本數據的問題,期望的結果以及你想要計算完成的解釋。 –

0

這是沒有答案

創建一個函數來檢查zero這樣

CREATE FUNCTION [dbo].[IsZero] (
    @Number FLOAT, 
) 
RETURNS FLOAT 
AS 
BEGIN 

    IF (@Number = 0) 
    BEGIN 
     SET @Number = 1 
    END 

RETURN (@Number) 

END 
0

不是很優雅,但會做的工作。

SELECT CASE WHEN (1 - (x2.sdp/100) = 0 THEN NULL 
      WHEN (x1.dp/100) = 0 THEN NULL 
      WHEN (x1.hup/(x1.dp/100)) = 0 THEN NULL 
      WHEN (x1.hup/(x1.hup/(x1.dp/100))) = 0 THEN NULL 
      ELSE (1 - (1 - (x1.hup/(x1.hup/(x1.dp/100))))/(1 - (x2.sdp/100))) 
      END AS field 
FROM yourtable 
0

合併爲零不是您正在尋找的魔力子彈。

只是試圖簡化你的問題;如果你有42/xxnull,用零替換它只會導致一個除法錯誤。

我不知道你在這種情況下應用的公式,但你缺乏的主要是驗證。在我上面的例子中,如果x等於0,我們遇到了問題。

同樣,在23/(100 - x),x不能是100,所以你必須事先檢查並相應地處理情況。如果它是一個除數,沒有表達式可以導致0。

因此,試圖確定哪些限制應該在處理之前觀看;例如,對於x1.dpx1.hupx2.sdp可能不是100(1 - 100/100 = 0,對吧?),您的聲明不得接受0。如果發生這些情況之一,您可能會返回錯誤或其他內容。

+0

我認爲你誤解了這個問題。 NULLIF可以將零除數轉換爲null,從而使完整的計算爲空,這顯然是OP所需的。問題或多或少都是將NULLIF放置成處理除數可以爲空的所有情況。 –