2017-07-07 8 views
1

Werte I eine einfache Funktion erstellt haben:PostgreSQL: get Eingabeparameter als Reihe

create function my fucnction(uuid, uuid, date) returns boolean as 
$$ 
    select ... from t where t.f1 = $1 and t.f2 = $2 and t.f3 = $3; 
$$ 
language sql stable; 

Es große Syntax-weise wäre, wenn ich die Eingangsparameter als eine einzelne Zeile zugreifen konnte (die ($1, $2, $3) gleich sein würde in meiner Funktion), so konnte ich schreiben:

create function my fucnction(uuid, uuid, date) returns boolean as 
$$ 
    select ... from t where (t.f1, t.f2, t.f3) = <the input parameters row>; 
$$ 
language sql stable; 

, die gleich sein würde:

create function my fucnction(uuid, uuid, date) returns boolean as 
$$ 
    select ... from t where (t.f1, t.f2, t.f3) = ($1, $2, $3); 
$$ 
language sql stable; 

Ist das möglich?

+1

'... wo (t.f1, t.f2, t.f3) = ($ 1, $ 2, $ 3);' Das sollte funktionieren. Hast du getestet und es funktioniert nicht? –

+0

Das funktioniert super. Aber ich suche nach einem Syntaxersatz für '($ 1, $ 2, $ 3)'. Etwas wie 'NEW' und' OLD', die in Triggern verwendet werden können. Gibt es das? –

Antwort

2

Das funktioniert für mich. Ich bin ein großer Fan der row() Funktion, vor allem in count(distinct row()) Abfragen.

create OR REPLACE function my_function(text,text,text) returns bigint as 
$$ 
    select count(*) from t where row(t1,t2,t3) = row($1,$2,$3); 
$$ 
language sql stable; 

select * from my_function('a','b','c'); 

Hinweis: Dies scheint auch mit Syntax von (t1,t2,t3), zu arbeiten.

EDIT: Ich habe möglicherweise Ihre Frage missverstanden. Wenn Sie insbesondere eine benannte Referenz wie in Triggern möchten, können Sie immer einen Record-Typ übergeben (hier verwende ich den Typ, der in der Tabelle t definiert ist). Es könnte ein Blick in die record datatype wert sein sowie plpgsql wenn Sie eine komplexere Funktion benötigen:

create OR REPLACE function my_function(blast t) returns bigint as 
$$ 

    select count(*) from t where (t1,t2,t3) = blast; 
$$ 
language sql stable; 

select * from my_function(row('a','b','c')); 

Eine letzte alternative - geben nicht die Nettigkeit der Syntax oben, vermutlich, weil der Typ nicht definiert ist , aber wenn Sie separate Parameter auf Eingabe benötigen:

create OR REPLACE function my_function(_1 text, _2 text, _3 text) returns bigint as 
$$ 

    select count(*) from t where (t1,t2,t3) = (my_function._1, my_function._2, my_function._3); 
$$ 
language sql stable; 

select * from my_function('a','b','c') 
+0

In Bezug auf Ihre Bearbeitung, ich denke, wählen Sie count (*) von t wo (t1, t2, t3) = blast "wird dann funktionieren? –

+0

Korrekt - nur bestätigt. Eine weitere Alternative, die ich hinzufügen werde, gibt Ihnen aber nicht das schöne 'where (t1, t2, t3) = blast'. – cole

+0

Danke! Ich wusste jetzt 'row()', scheint sehr praktisch. Ich werde nach deiner Bearbeitung akzeptieren! –

Verwandte Themen