PL/R函数接受两个表作为参数

jan*_*cki 5 postgresql r plpgsql plr

我很难找到一个可以接受两个postgres表的PL/R函数的例子.PL/R docs没有提供任何这样的例子.
要有一个工作示例,我们可以考虑在R端使用两个postgres表的合并.

在postgres有两张桌子

CREATE TABLE x (a numeric, b text);
CREATE TABLE y (a numeric, d text);
INSERT INTO x VALUES (1, 'a'),(2, 'b');
INSERT INTO y VALUES (2, 'b'),(3, 'c');
Run Code Online (Sandbox Code Playgroud)

我想替换以下查询

SELECT * FROM x INNER JOIN y ON x.a=y.a;
Run Code Online (Sandbox Code Playgroud)

使用R中定义的PL/R函数:

my_function = function(x, y){
    merge(x, y, by = "a")
}
Run Code Online (Sandbox Code Playgroud)

我能够调用PL/R函数,它接受单个表,但不是两个.

Rob*_*bin 2

我不认为 postgeql 可以接受真实的表作为参数。

但还有另一种方法可以做到这一点。您可以将表名称作为参数传递。
这是函数

CREATE OR REPLACE FUNCTION merge(t1 text, t2 text)
returns setof x as 
   BEGIN
     execute 'select * from ' || t1 ||' join ' || t2 || ' on t1.a=t2.a';
   END
Run Code Online (Sandbox Code Playgroud)

以上是postgresql的函数,也可以用R函数编写。
这是R的代码

  1. 我们必须将表 x 的所有值存储到变量 x 中。请参阅下面的代码

    x <- dbGetQuery(con, "SELECT * from sandbox.x")--con 是连接到数据库的连接,sandbox 是模式名称,x 是表名称

  2. 将表 y 的值存储到变量 y 中

    y<-dbGetQuery(con, "SELECT * from sandbox.y")

  3. 合并2个表

    total <- merge(x,y,by="a")

  4. 您还可以编写另一个函数来包装合并函数,请参阅下面的代码

    myTotal <- function(x,y) { result <- merge(x,y,by="a") return(result) }

我附上步骤截图供您参考

在此输入图像描述