wake-up-neo.net

Wie schreibe ich eine Funktion für optionale Parameter in postgresql?

Meine Anforderung ist, optionale Parameter zu einer Funktion zu schreiben. Parameter sind optional, manchmal füge ich hinzu oder ich übergebe keine Parameter an die Funktion. Kann mir jemand helfen, wie man eine Funktion schreibt?.

Ich schreibe gerne

select * 
from test 
where field3 in ('value1','value2') 
 and ($1 is null or field1 = $1) 
 and ($2 is null or field2 = $2) 
 and ($3 is null or field3 = $3);

ich übergebe Parameter an die Abfrage, aber meine Ausgabe wird nicht erwartet. Wenn ich alle drei Parameter übergebe, ist meine Ausgabe korrekt, andernfalls wird keine Ausgabe erwartet.

25
indu

Sie können optionale Parameter definieren, indem Sie einen Standardwert angeben.

create function foo(p_one integer default null, 
                    p_two integer default 42, 
                    p_three varchar default 'foo')
  returns text
as
$$
begin
    return format('p_one=%s, p_two=%s, p_three=%s', p_one, p_two, p_three);
end;
$$
language plpgsql;

Sie können Parameter am Ende "weglassen", daher sind foo(), foo(1) oder foo(1,2) gültig. Wenn Sie nur einen Parameter angeben möchten, der nicht der erste ist, müssen Sie die Syntax verwenden, die die Parameternamen angibt.

select foo(); 

gibt zurück: p_one=, p_two=42, p_three=foo

select foo(1); 

gibt zurück: p_one=1, p_two=42, p_three=foo

select foo(p_three => 'bar')

gibt zurück: p_one=, p_two=42, p_three=bar

50

Abgesehen von der Option VARIADIC , auf die @a_horse_with_no_name zeigt, die nur ein Syntaxzucker für die Übergabe eines Arrays mit einer beliebigen Anzahl von Elementen ist vom gleichen Typ , Sie können nicht definieren eine Funktion mit optionalen Parametern, da in postgres Funktionen nicht nur durch ihren Namen, sondern auch durch gekennzeichnet sind seine Argumente und die Arten von ihnen.

Das heißt: create function foo (int) [...] und create function foo (varchar) [...] erzeugen verschiedene Funktionen.

Was aufgerufen wird, wenn Sie beispielsweise select foo(bar) ausführen, hängt vom Datentyp bar selbst ab. Das heißt: Wenn es eine Ganzzahl ist, rufen Sie die erste auf, und wenn es varchar ist, wird die zweite aufgerufen.

Mehr als das: Wenn Sie beispielsweise select foo(now()) ausführen, wird eine Funktion nicht vorhanden Ausnahme ausgelöst.

Wie gesagt, Sie können keine Funktionen mit variablen Argumenten implementieren , aber Sie können mehrere Funktionen mit demselben Namen und unterschiedlichen Argumenten (einem/oder Typ) implementieren, die denselben Datentyp zurückgeben .

Wenn Sie die Funktion (offensichtlich) nicht zweimal implementieren möchten, müssen Sie lediglich eine "Master" -Funktion mit allen möglichen Parametern implementieren und die anderen (mit weniger Parametern) rufen nur die "Master" -Funktion auf mit Standardwerten für die nicht empfangenen Parameter.

6
bitifet

Als Option habe ich eine Funktion bekommen, die ich mit der Navicat App getestet habe: CREATE OR REPLACE FUNCTION "public"."for_loop_through_query"(sponsor_name varchar default 'Save the Children') Das erzeugt mich. (Hinweis: Bitte beachten Sie den Parameterunterschied) CREATE OR REPLACE FUNCTION "public"."for_loop_through_query"("sponsor_name" varchar='Save the Children'::character varying)

 CREATE OR REPLACE FUNCTION "public"."for_loop_through_query"("sponsor_name" varchar='Save the Children'::character varying)
  RETURNS "pg_catalog"."void" AS $BODY$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT
      companies."name" AS org_name,
      "sponsors"."name" AS sponsor_name
      FROM
      "donor_companies"
      JOIN "sponsors"
      ON "donor_companies"."donor_id" = "sponsors"."id" 
      JOIN companies
      ON "donor_companies"."organization_id" = companies."id"
      WHERE
      "public"."sponsors"."name" = sponsor_name
    LOOP
    RAISE NOTICE '%', rec.org_name;
  END LOOP;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
0
Kiry Meas