The*_*off 3 postgresql set-returning-functions
如果我创建一个f查询函数的函数,我认为如果返回类型是表名而不是RETURNS TABLE(id integer, name text).
CREATE TABLE users ( id integer, name text );
CREATE OR REPLACE FUNCTION f()
RETURNS users
AS $$
SELECT * FROM users
WHERE FALSE
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
但是当函数中的查询返回零行时,我得到了奇怪的结果。
SELECT * FROM f();
Run Code Online (Sandbox Code Playgroud)
预期结果
CREATE TABLE users ( id integer, name text );
CREATE OR REPLACE FUNCTION f()
RETURNS users
AS $$
SELECT * FROM users
WHERE FALSE
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
实际结果
SELECT * FROM f();
Run Code Online (Sandbox Code Playgroud)
如果有更多列,它们仍然都是null. 如果函数中的查询返回任何行,则它按预期工作。如果我使用RETURNS TABLE(...)语法,我不会得到这种行为。
有没有办法解决这个问题?
我正在使用 PostgreSQL 9.6
这与返回类型无关,而是与您将函数声明为返回单行这一事实有关。
代替
RETURNS users
Run Code Online (Sandbox Code Playgroud)
和
RETURNS SETOF users
Run Code Online (Sandbox Code Playgroud)
并且您的功能将按预期工作。
正如您的函数一样,如果查询没有结果,它将返回 NULL,如果查询有多个结果行,它将返回第一行。
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |