我有一个函数 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)
我会这样做,
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)
创建一个函数,接受的行类型foo
一bool
和的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
或任何您喜欢的谓词。
这似乎有效:
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)
归档时间: |
|
查看次数: |
11874 次 |
最近记录: |