Hallo,
wir benutzen pgsql 8.3 und wollen als Funktion eine Query dynamisch zusammenbauen, allerdings muss in dieser Query eine weitere Funktion aufgerufen werden. Das sieht dann z.B. so aus:
sql := ‘SELECT * FROM tabelle WHERE func_2(’ || para_1 || ') … ';
Das Problem ist: wenn para_1 NULL ist, wird die ganze Query NULL, anstatt NULL an die func_2 zu übegeben.
Wie können wir das lösen? Wie übergibt man die Funktionsparameter evt. richtig?
Yufiel
Weil in der func_2 der Parameter para_1 auf IS NOT NULL getestet wird. Sonst kann der parameter jede Zeichenfolge enthalten.
Mit coalesce(para_1, ‘NULL’) wird dann die Zeichenfolge ‘NULL’ übergeben werden, nicht NULL ansich.
Du baust doch die Query in einer PL/pgSQL-Funktion zusammen, oder?
Die dynamisch erstellte Query ist ja auch zunächst ein Text, nur dass dieser dann eben mit EXECUTE ausgeführt.
Falls das ganze aber in einer externen Funktion (z.B. PHP) erstellt wird, geht das ganze natürlich nicht so, dann müsste mit Hilfe der Skript- / Programmiersprache der entsprechende Ausdruck zusammengebastlet werden.
Jo, baue die Funktion in PL/pgSQL-Funktion und führe darauf ein EXECUTE aus.
Wenn ich: coalesce(para_1, ‘NULL’) so benutze bekomme ich aber bei Parametern die ein Integer erfordern, folgende Fehlermeldung:
FEHLER: ungültige Eingabesyntax für ganze Zahl: »NULL«
(Ich benutze pgAdmin III 1.8.2)
(Deswegen dachte ich bei den varchars würde ich das gleich Problem bekommen, das habe ich nicht weiter ausprobiert…)
Moin,
also bei genauerer Analyse wo der Fehler herkommt habe ich festgestellt, das sie gar nicht mal vom EXECUTE kommt, sondern schon von coalesce().
Dort hatte ich als ersten Parameter eine Zahl drinne und das führt zu dem Fehler: SELECT ‘Hallo’ || coalesce(2, ‘NULL’) || ‘Bla’;
Ohne ‘NULL’ in der Anweisung, geht sie zwar, aber wenn statt der 2 wieder der para_1 steht und dort mal NULL drinne steht, gibts zwar keine Fehlermeldung, aber der gesamte Ausdruck ist dann weider NULL.
‘Hallo’ || coalesce(para_1) || ‘Bla’;
wenn du dem coalesce natuerlich nur einen parameter uebergibst, dann kann das ergebnis freilich auch null sein. es ist i.d.R. sinnvoll als letzten parameter eine konstante anzugeben - damit IMMER etwas verschiedenes von NULL geliefert wird.
das liegt wahrscheinlich daran, dass coalesce argumente gleichen typs erwartet …
wir wollen ja einen string zusammenbauen, den wir execute uebergeben, also solltest du COALESCE(para_1::text, ‘NULL’) anwenden, damit wir uns auf Strings einigen … somit liefern COALESCE auch immer einen String - so wir ja wollen.