PostgreSQL:获取输入参数作为行值

时间:2017-07-07 08:37:50

标签: postgresql syntax plpgsql

我创建了一个简单的函数:

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;

这可能吗?

1 个答案:

答案 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')