2016-03-31 7 views
0

In this question Ich fragte, ob Mysql eine Funktion haben, die zwei Argumente erhält und null zurückgibt, wenn die erste null oder das zweite Argument ist andernfalls. Jemand hat im Kommentarabschnitt gesagt, dass solche Funktion nicht existiert. Wie kann ich diese Funktion in Mysql definieren, wenn man bedenkt, dass sie Argumente beliebigen Typs erhalten kann und der Rückgabewert null oder vom selben Typ des zweiten Parameters sein kann? Ist es überhaupt möglich?Mysql - Umwandlung von Nicht-Null-Werte Teil 2

+0

'select Fall, wenn arg1 null ist dann null sonst arg2 end' –

+0

Die einfachste Methode ist' (Fall, wenn arg1 dann arg2 Ende nicht null ist) '. Eine Funktion, die Sie scheinen wollen, ist 'nvl2()' von Oracle. –

+1

MySQL unterstützt [COALESCE] (http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce), die dafür funktionieren werden, wenn ich Sie richtig verstehe. –

Antwort

0

Dies ist aufgrund Ihrer Anforderungen nicht möglich.

Die Argumente und Rückgabewerte von gespeicherten Funktionen (in SQL geschrieben) und benutzerdefinierten Funktionen (in C geschrieben) sind alle statisch typisiert.

Zugegeben, MySQL ist ziemlich flexibel mit implizitem Casting, aber die Werte sind dennoch getippt. Selbst wenn Sie mit implizitem Casting zufrieden waren, ist ein Szenario, in dem dies der scheinbar offensichtlichen Lösung vorzuziehen wäre, schwer vorstellbar.

IF(foo IS NULL,foo,bar) würde zum Zweck genügen und die zugrunde liegenden Typen richtig zu bewahren, und IF(foo IS NULL,NULL,bar) wäre fast das gleiche, obwohl die Art der foo verloren gehen würde (zum Beispiel ein „es ist ein NULL DATETIME-“).

Sie haben diese aus Gründen abgelehnt, die nicht intuitiv offensichtlich sind. Wenn ein Zweck mit Einbauten erreicht werden kann, ist die Motivation, das Rad neu zu erfinden, schwer zu verstehen.

+0

Es ist nicht das, was ich will, ich möchte eine Funktion machen, die nur zwei Argumente erhält, und Sie erklären nur, dass ich mich mit dieser "if" Funktion vertraut machen sollte, weil ich mein Ziel nicht erreichen kann. Der Grund, warum ich es tun möchte, ist ziemlich direkt, ich habe diesen Fall: 'coalesce (if (isNull (sale.id), null, 'im Zusammenhang mit einem Verkauf'), if (isNull (purchace.id), null, "im Zusammenhang mit einem Kauf")), weil ich einige linke Joins mache, um einen Zahlungskontext zu erhalten, aus irgendeinem Grund, der den Rahmen dieser Frage sprengt. – FtheBuilder

+0

* Facepalm. * Warum hast du das nicht gesagt? Ihre Lösung einfach: 'CASE WANN sale.id ist nicht NULL THEN 'im Zusammenhang mit einem Verkauf' WANN purchase.id ist nicht NULL THEN 'im Zusammenhang mit einem Kauf' ELSE 'im Zusammenhang mit lustigen Katzen Videos' END'. Die erste Übereinstimmung in einem 'CASE'-Ausdruck bestimmt das Ergebnis ... genau wie das erste Nicht-NULL-Argument zu' COALESCE() '. Du, mein Freund, scheinst uns mit einem klassischen [XY-Problem] (http://xyproblem.info) behandelt zu haben und fragst nach deiner Lösungsansätze, anstatt nach dem eigentlichen Problem. –

+0

Ich schätze Ihren Versuch zu helfen. Ich möchte den Nullkontext selbst umhüllen und nur das behandeln, was spezifisch ist, wie die Denkweise der Monade von Haskell, ich will nicht alles, was du gezeigt hast, ich habe es bereits erwogen Ich weiß, ob ich es so lösen könnte, wie dies "koaleszieren" (f (sale.id, "im Zusammenhang mit einem Verkauf"), f (purchase.id, "im Zusammenhang mit einem Kauf")).Jeder hier versteht nicht, dass es einen Kontext von "null" oder "Abwesenheit" gibt, den ich intuitiv behandeln möchte, wie die Haskell Maybe-Monade, aber in SQL ... – FtheBuilder

0

versuchen Sie dies:

Select IF(ISNULL(arg1), null, arg2) 

mehr über Comparison Functions and Operators und Control Flow Functions lesen.

+0

Es hat eine Menge Standard, und ich habe bereits erwähnt, über den Ansatz, den Sie in meiner vorherigen Antwort vorschlagen. Ich möchte eine Funktion 'myFunction (x, y)' definieren, die meinen Frageanforderungen folgt, diese IF-Funktion nicht verwenden. – FtheBuilder