NULL als Parameterübergabe

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

Schau mal nach COALESCE …

Hmmmm, ich denke das trifft es nicht ganz. Wir könnten zwar jetzt schreiben:

sql := ‘SELECT * FROM tabelle WHERE func_2(’ || coalesce(para_1, ‘default-qwert’) || ') … ';

Aber in der Nachfolgenden Funktion func_2 brauchen wir auch NULL als möglichen Wert. :frowning:

Gibt es noch eine Art der Übergabe?

Yufiel
P.S. Danke für die schnelle Antwort.

was spricht dagegen:

sql := 'SELECT * FROM tabelle WHERE func_2(' || coalesce(para_1, 'NULL') || ') ... ';

?

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. :frowning:

Yufiel

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…)

Okay, ich kenne pgAdmin nicht, vielleicht quotet pgAdmin das ‘NULL’ nochmal…

Wird denn der Fehler von func_2 oder von der Funktion geliefert, die die Query zusammenbastelt? Gibt doch mal die Variable mit

RAISE NOTICE 'sql = %', sql

aus und schick die Query dann direkt an PostgreSQL…

(ich benutze übrigens ausschließlich psql)

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. :frowning:
‘Hallo’ || coalesce(para_1) || ‘Bla’;

Yufiel

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.

Hmmm, gut, wenns anders nicht geht müssen wir uns einen Default Wert, der von NULL verschieden ist, überlegen.

Danke für die Antworten.

Bis zu unserem nächsten Problem. :smiley:

Yufiel

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.

Ahhhh, stimmt so gehts. Coool.

Danke! :slight_smile:

Yufiel