我创建了一个简单的函数:
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;
如果我可以将输入参数作为单行访问(在我的函数中等于($1, $2, $3)
),这将是很好的语法方式,所以我可以写:
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;
等于:
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;
这可能吗?
答案 0 :(得分:2)
这对我有用。我是row()
函数的忠实粉丝,特别是在count(distinct row())
查询中。
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');
注意:这似乎也适用于(t1,t2,t3)
的语法。
编辑:我可能误解了您的问题。如果你特别需要像触发器那样的命名引用,你总是可以传入一个记录类型(这里我使用的是表t
定义的类型)。如果您需要更复杂的功能,可能值得查看record
datatype以及 PLPGSQL :
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'));
最后一个alternative - 没有给出上面语法的好处,大概是因为没有定义类型,但是如果你需要在输入上使用单独的参数:
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')