gpt4 book ai didi

postgresql - Postgres 函数总是返回一行

转载 作者:行者123 更新时间:2023-11-29 12:31:09 29 4
gpt4 key购买 nike

我在 Postgres 中编写了以下函数,但我遇到了一个问题:它总是返回一行。我的意思是,当没有用户与该对匹配时,它会返回所有列为空的行。

有没有办法让函数在没有结果时返回 0(零)行?

CREATE OR REPLACE FUNCTION find_user_by_credentials(email text, password text)
RETURNS
"User"
AS
$$
SELECT *
FROM "User" AS "U"
WHERE email = "U"."Email" AND "U"."Password" = md5(password || "U"."Salt")
;
$$
LANGUAGE SQL IMMUTABLE STRICT;

有趣的是:如果我将返回类型从“用户”更改为TABLE("Email"text,"GivenName"text,"ID"int8, "Password"text,"Salt"text)

它按预期工作。但我真的想使用对“用户”的“引用”,因为维护起来会更容易。

谢谢!

最佳答案

这是一个标量函数,所以它每次都必须返回值。您可能需要一个 SRF 函数,设置返回函数:

CREATE OR REPLACE FUNCTION public.foo(boolean)
RETURNS integer
LANGUAGE sql
AS $function$
SELECT * FROM generate_series(1,2) WHERE $1;
$function$

CREATE OR REPLACE FUNCTION public.srf_foo(boolean)
RETURNS SETOF integer
LANGUAGE sql
AS $function$
SELECT * FROM generate_series(1,2) WHERE $1;
$function$

postgres=# \pset null [NULL]
Null display is "[NULL]".
postgres=# SELECT * FROM foo(false);
┌────────┐
│ foo │
╞════════╡
│ [NULL] │
└────────┘
(1 row)

postgres=# SELECT * FROM srf_foo(false);
┌─────────┐
│ srf_foo │
╞═════════╡
└─────────┘
(0 rows)

这可能有点奇怪,因为 PostgreSQL 区分标量函数和 SRF 函数,但允许将 SRF 用作标量和将标量用作 SRF(但最好在 FROM 子句中使用 SRF 函数,在查询表达式中使用标量函数:

postgres=# SELECT srf_foo(false);
┌─────────┐
│ srf_foo │
╞═════════╡
└─────────┘
(0 rows)

postgres=# SELECT foo(false);
┌────────┐
│ foo │
╞════════╡
│ [NULL] │
└────────┘
(1 row)

你可以看到,SRF功能正在发挥作用:

postgres=# SELECT * FROM srf_foo(true);
┌─────────┐
│ srf_foo │
╞═════════╡
│ 1 │
│ 2 │
└─────────┘
(2 rows)

对于您的示例 - 只需将 return 子句更改为 RETURNS SETOF "User"

关于postgresql - Postgres 函数总是返回一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30152720/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com