2016-07-29 30 views
0

我有一個非常大的mysql調用,我不打算將它顯示出來,因爲它並不重要。這是一個需要修改之前做工精細的部分是這樣的:如何在COALESCE調用期間正確解析空值

COALESCE(d1.apFunReq, d2.apFunReq, d3.apFunReq, d4.apFunReq, d5.apFunReq, d6.apFunReq, d8.apFunReq, d2old.apFunReq, d3old.apFunReq, d5old.apFunReq, '') AS 'Funding Required', 

這將返回所有apFunReq值在多個表中,如果不考慮空或填充。工作很好,沒有問題。

現在已經決定我們需要另外一個表數據來加入這個過程,但是所需的數據並不是全部放在這個新表的一列中,而是需要將它們統一加在5列上。所以,我已經實現了這一點:

COALESCE(d1.apFunReq, d2.apFunReq, d3.apFunReq, d4.apFunReq, d5.apFunReq, d6.apFunReq, d8.apFunReq, (IFNULL(d10.reqFunding_01, 0) + IFNULL(d10.reqFunding_02, 0) + IFNULL(d10.reqFunding_03, 0) + IFNULL(d10.reqFunding_04, 0) + IFNULL(d10.reqFunding_05, 0)), d2old.apFunReq, d3old.apFunReq, d5old.apFunReq, '') AS 'Funding Required', 

現在,這對結果的新表中的行不實際工作,但它打破了原先預想返回OK的顯著部分。現在很多其他表的值只是返回爲0.

很明顯,我需要返回空值爲0爲d10內的數據,以增加工作,但我希望其他表中的空值保持爲空,並且我希望所有表格的數據能夠按照需要明顯工作。

我不知道我在做什麼錯誤,以獲得所需的結果。有人可以幫助我嗎?

Ç

+1

好吧,是的。 coalesce按順序掃描參數並返回第一個非空的參數。因爲你的'ifnull()'鏈或者返回那個或者一個零,它的定義從不爲空,並且聚結總是會在那裏停止。將其移動到合併呼叫 –

+0

中的最後一個位置或者,如果由於它優先於後面的字段而不能位於最後位置,則可能必須將該討厭的數學位包裝爲CASE或IF語句以當返回值爲0時吐出NULL。它看起來不會很優雅,並且可能會有更奇妙的做法,但最終當它爲0時,它必須返回NULL。 – JNevill

+0

我認爲可以轉向最後的位置,但是如果再添加另一個類似的另一個表的調用會發生什麼?此外,它似乎以前爲空返回(他們被要求)現在返回爲0.這可以很容易地修復或將變得更加混亂和複雜? – Cassandra

回答

0

簡單的方法來解決這個問題是使用NULLIF您添加後把所有的IFNULL ED值,像這樣:

COALESCE(d1.apFunReq, d2.apFunReq, d3.apFunReq, d4.apFunReq, d5.apFunReq, d6.apFunReq, d8.apFunReq, 
    NULLIF(IFNULL(d10.reqFunding_01, 0) + IFNULL(d10.reqFunding_02, 0) + IFNULL(d10.reqFunding_03, 0) + IFNULL(d10.reqFunding_04, 0) + IFNULL(d10.reqFunding_05, 0), 0), 
    d2old.apFunReq, d3old.apFunReq, d5old.apFunReq, '') AS 'Funding Required', 

顯然,這並不工作,如果0是一個有效的答案,雖然。

+0

謝謝CSTobey--您的解決方案確實可以完美工作,無需重新排序。在我的情況下,0永遠不會是一個有效的答案,0應始終被視爲空值,因爲這些條件的零值等於零。 – Cassandra