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
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 –
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
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