如何将行作为参数传递给 Postgres 函数?

jas*_*e81 10 postgresql

我有一个函数 build_details(),它将另一个表中的单行/记录作为其参数之一。

这是我想要做的,但它不起作用:

SELECT build_details(
    SELECT * FROM my_table LIMIT 1,
    1000,
    TRUE)
Run Code Online (Sandbox Code Playgroud)

我想从 my_table 中取出一行并将其传递给函数,以便我可以运行它。如何使用 my_table 中的记录从终端调用该函数?

dra*_*org 10

那要简单得多。虽然人们期望它是......

SELECT build_details(my_table.*, 1000, TRUE) FROM my_table LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

...实际语法是:

SELECT build_details(my_table, 1000, TRUE) FROM my_table LIMIT 1;
Run Code Online (Sandbox Code Playgroud)


Eva*_*oll 8

我会这样做,

SELECT *
FROM my_table
CROSS JOIN LATERAL build_details( my_table, 1000, true )
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

您可以在下面的一些示例数据中看到这一点。

-- create some sample data,
CREATE TABLE foo(bar)
  AS VALUES (42::int), (7);

-- select a row object, representing every row in foo;
SELECT foo 
FROM foo;
Run Code Online (Sandbox Code Playgroud)

创建一个函数,接受的行类型foobool和的int,只是提出了一个通知,返回true。

CREATE FUNCTION build_details( myrow foo, j int, k bool )
RETURNS bool AS $$
  BEGIN
    RAISE NOTICE '%, %, %', myrow, j, k;
    RETURN true;
  END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用上面的语法传递代表行 in 的行对象foo,以及另外两个变量 anint和 a bool

SELECT *
FROM foo
CROSS JOIN LATERAL build_details(foo::foo, 1000, true);
NOTICE:  (42), 1000, t
NOTICE:  (7), 1000, t
 bar | build_details 
-----+---------------
  42 | t
   7 | t
(2 rows)
Run Code Online (Sandbox Code Playgroud)

当然,您仍然可以使用LIMIT或任何您喜欢的谓词。


jas*_*e81 5

使用子选择重新选择行

这似乎有效:

SELECT * FROM public.build_details(
    (SELECT r.*::public.my_table FROM (TABLE public.my_table) r LIMIT 1),
    1000,
    TRUE);
Run Code Online (Sandbox Code Playgroud)