2016-07-29 6 views
0

Ich habe einen ziemlich großen mysql-Aufruf, den ich nicht stören werde, das alles zu zeigen, weil es nicht wirklich wichtig ist. Der Teil, der fein arbeitet vor der Modifikation erfordern sah wie folgt aus:Wie Null-Werte korrekt während eines COALESCE-Aufrufs aufgelöst werden

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

Diese alle apFunReq Werte in mehreren Tabellen zurückkehren würde, unabhängig davon, ob null oder gefüllt. Hat super funktioniert, keine Probleme.

Nun wurde entschieden, dass wir weitere Tabellendaten benötigen, um an dem Prozess teilzunehmen, jedoch liegen die benötigten Daten nicht alle in einer Spalte dieser neuen Tabelle, sondern müssen zusammen in 5 Spalten zusammengefasst werden. So habe ich dies umgesetzt:

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', 

Nun ist dieser funktioniert tatsächlich für die neuen Tabellenzeilen im Ergebnis, aber es bricht einen wesentlichen Teil von dem, was vorher zurückkehrt ok. Jetzt werden viele der anderen Tabellenwerte nur als 0 zurückgegeben.

Natürlich muss ich Null-Werte für Daten innerhalb von D10 für die Addition auf 0 zurückgeben, aber ich möchte, dass Null-Werte aus den anderen Tabellen Null bleiben und Ich möchte, dass die Daten für alle Tabellen offensichtlich wie gewünscht funktionieren.

Ich bin nicht sicher, was ich falsch mache, um das gewünschte Ergebnis zu erhalten. Kann mir bitte jemand dabei helfen?

C

+1

gut, ja. coalesce scannt die Argumente in der richtigen Reihenfolge und gibt die erste nicht null zurück. Da Ihre 'ifnull()' Kette entweder diese Summe oder eine Null zurückgibt, ist sie definitionsgemäß NIEMALS NULL und die Koalition endet immer dort. Verschieben Sie es an die letzte Position in der Zusammenführungsaufruf –

+0

Oder, wenn es nicht an der letzten Position sein kann, weil es Vorrang vor den folgenden Feldern hat, müssen Sie möglicherweise diese fiese Bit der Mathematik in eine CASE-oder IF-Anweisung zu umbrechen spucke NULL aus, wenn die Rückkehr 0 ist. Es wird nicht sehr elegant aussehen und es mag eine schickere Art, es zu tun, aber letztlich muss das Ding NULL zurückgeben, wenn es 0 ist. – JNevill

+0

Ich denke, es ist in Ordnung, zum letzten zu wechseln Position, aber was passiert, wenn ein weiterer ähnlicher Anruf zu einer anderen Tabelle hinzugefügt wird? Es scheint auch, dass zuvor Null-Returns (wo sie gesucht wurden) nun als 0 zurückkommen. Kann dies leicht behoben werden oder würde das unordentlicher und komplizierter? – Cassandra

Antwort

0

Der einfache Weg zur Lösung dieses NULLIF zu verwenden ist, nachdem Sie wie so alle IFNULL ed Werte aufsummieren:

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', 

Offensichtlich ist dies nicht funktioniert, wenn 0 wenn eine gültige Antwort .

+0

Vielen Dank CSTobey - Ihre Lösung hat perfekt funktioniert, ohne dass Sie überhaupt etwas nachbestellen müssen. In meiner Situation wird 0 niemals eine gültige Antwort sein, 0 sollte immer als null betrachtet werden, da ein Wert von Null für diese Begriffe nichts bedeutet. – Cassandra

Verwandte Themen