Ich frage mich, ob dies in Postgres möglich ist:
Am besten anhand eines erfundenen Beispiels erklären:
create or replace function test_function(filter_param1 varchar default null
, filter_param2 varchar default null)
returns integer as
$$
declare
stmt text;
args varchar[];
wher varchar[];
retid integer;
begin
if filter_param1 is not null then
array_append(args, filter_param1);
array_append(wher, 'parameter_name = $1');
end if;
if filter_param2 is not null then
array_append(args, filter_param2);
array_append(wher, 'parameter_name = $2');
end if;
stmt := 'select id from mytable where ' || array_to_string(wher, ' or ');
execute stmt into retid using args;
return retid;
end;
$$ language plpgsql;
In Python gibt es *args
- vielleicht hat PostgreSQL einen ähnlichen Mechanismus?
EDIT für Erwin Brandstetter Fragen:
- Alle
filter
Parameter werden auf verschiedene Spalten angewendet, sollten jedoch UND-verknüpft sein. - Die Rückkehr
setof
ist hier viel sinnvoller. - Alle Parameter können vom gleichen Spaltentyp sein (dh
varchar
).
parameter_name
? (Das könnte weitgehend vereinfacht werden.) Oder denken Sie wirklich an verschiedene Spalten? Möchten Sie einen einzelnen Wert oder eine Reihe von Werten zurückgeben? Eine Reihe von OR-Prädikaten gibt normalerweise mehrere Zeilen zurück, was nicht zu Ihrer RETURNS
Klausel passt .
EXECUTE ... USING
ich kann kein Array von Argumenten annehmen, da PostgreSQL-Arrays keine heterogenen Typen unterstützen. Sie müssen ein Array eines einzelnen konkreten Typs sein, und SQL hat möglicherweise nicht für jeden Parameter den gleichen Typ. Es wäre nutzlos, außer für sehr enge Anwendungsfälle. StattdessenUSING
müsste in der Lage sein, einen anonymen Datensatz zu erstellen, wie Sie ihn von einemROW(...)
Konstruktor erstellen ... was wahrscheinlich möglich, aber derzeit nicht implementiert ist.