Konvertieren to_char(null)

Hallo ,

ich habe ein Porblem.
Es gibt eine Funktion ,wo aus uebergebnenen int Variablen ein String zusammengesetzt wird:
z.B. select to_char(52)||’#’||to_char(null)
sollte rauskommen >>> 52#,
bei mir kommt es aber nichts, eben null.

Die Analyse zeigte, das es an to_char Funktion liegt:
to_char(null) liefert kein leeres String sondern null.

CREATE OR REPLACE FUNCTION to_char(numeric)
RETURNS text
LANGUAGE SQL STRICT IMMUTABLE
AS
$$
cast($1 AS text)
$$;

Hier wird anscheinend übergebener NULL nicht erkannt.
Ich habe eine weitere änliche Funktion erstellt :
CREATE OR REPLACE FUNCTION to_char_test(numeric)
RETURNS text
LANGUAGE SQL STRICT IMMUTABLE
AS
$$
SELECT case when $1 is not null then cast($1 AS text) else cast(54 AS text) end
$$;

select to_char_test(52)||’#’|| liefert 52#
select to_char_test(52)||’#’||to_char_test(null) liefert nichts (null)zurück.
Wieso wird übergebener NULL nicht als is null behandelt?
Wo könnte das Problem liegen?

Und ich die Lösung dafür: coalesce().

Andreas

according the doc:

RETURNS NULL ON NULL INPUT or STRICT indicates that the function always returns null whenever any of its arguments are null.

Du hast das Teil als STRICT deklariert…

Andreas

Vielen Dank füer Hinweis mit STRICT,
mit coalesce würde auch funktionieren, in dem Fall aber musste ich das ganze Programmcode durchscannen und anpassen. Das ist zu umständlich.
Besser wäre es in einer Funktion zu haben.

Ich habe to_char mal umgeschrieben auf , also ohne STRICT :
CREATE OR REPLACE FUNCTION to_char(numeric)
RETURNS text
LANGUAGE SQL CALLED ON NULL INPUT
AS
$$
SELECT case when $1 is not null then cast($1 AS text) else ‘’ end
$$;


select to_char(null) >>> Resultat ist aber identisch mit dem alten - null wird zurückgelifert
Wenn man aber macht select to_char(null::numeric) dann funktioniert es und wird ein leeres String geliefert. Es ist aber wiedderum anpassung an dem Programmcode.

Was muss man in der Fkt to_char anpassen um diese Umwandlung to numeric umzugehen?

Also mit 8.1, was ich hier noch habe, tut das. Natürlich ist es nicht schön, da coalesce() existiert. Ich an deiner Stelle würde dies verwenden. Im übrigen gibt es schon eine Funktion to_char(), diese so zu überladen halte ich auch nicht gut.


Andreas