Hi zusammen,
ich habe bei der Umstellung einer Applikation von einer anderen Datenbank auf die PostgreSQL folgendes Problem:
während die alten Datenbank für
‘ABC’ || NULL || ‘DEF’
das Ergebnis ‘ABCDEF’ lieferte
liefert die PostrgreSQL ja bekanntlich NULL, sobald einer der beteiligten String = NULL ist.
mir ist auch klar, dass ich das mit Coalesce(…) oder Case in den Griff bekommen kann, ich dachte mir aber ich könnte mir doch einfach einen Operator definieren, der mir das Verhalten der alten Datenbank nachbildet.
Folgender Plan: || soll durch |+ ersetzt werden, wenn als Ergebnis ein Varchar(254) herauskommen soll und |* soll das ganze als Text ohne Längenbegrenzung zurückgeben.
Dafür habe ich mir folgende Funktionen definiert:
CREATE OR REPLACE FUNCTION public.nv(text)
RETURNS character varying AS
$BODY$
Select Coalesce($1,'');
$BODY$
LANGUAGE sql IMMUTABLE
COST 100;
CREATE OR REPLACE FUNCTION public.base_ConcatNull(text, text)
RETURNS character varying AS
$BODY$
Select cast(NV($1) || NV($2) as varchar(254));
$BODY$
LANGUAGE sql IMMUTABLE
COST 100;
CREATE OR REPLACE FUNCTION public.base_ConcatNullLong(text, text)
RETURNS Text AS
$BODY$
Select NV($1) || NV($2);
$BODY$
LANGUAGE sql IMMUTABLE
COST 100;
Die erste Funktion ist nur als Abkürzung für Coalesce(…, ‘’ ) gedacht, damit das ganze übersichtlicher wird und dann die beiden ConcatFunktionen
Als nächstes kamen dann die Operatoren dran
CREATE OPERATOR public.|+ (
leftarg = text,
rightarg = text,
procedure = base_ConcatNull,
commutator = |+ );
CREATE OPERATOR public.|* (
leftarg = text,
rightarg = text,
procedure = base_ConcatNullLong,
commutator = |* );
getestet, läuft auf einer leeren Testdatenbank wunderbar
BSP: Select ‘ABC’ |+ NULL |+ ‘DEF’ ==> ‘ABCDEF’
Dann habe ich das gleiche Script auf meiner Entwicklungsdatenbank laufen lassen
und dort bekomme ich nur den Fehler
FEHLER: Operator ist nur eine Hülle: text |+ text
LINE 1: select ‘ABC’ |+ NULL |+ ‘DEF’
In Englisch lautet der Fehler “operator is only a shell”, hilft mir aber auch nicht weiter
Ich habe alles noch mal gedropt, wieder laufen lassen, keine Änderung. Auch in Netz finde ich zu dem Fehler recht wenig, bzw hier ist nur von einem Negator die Rede, aber was soll die Negation einer Concatenierung sein ?
Wenn mir da jemand helfen könnte ware das prima, denn ich komme hier einfach nicht weiter und es würde mir viel Arbeit ersparen, wenn ich die Änderung so machen könnte, wie hier gezeigt
Vielen Dank für die Mühe
JSpatz