当返回类型是表名时,为什么 PostgreSQL 函数返回空列而不是没有行?

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

Lau*_*lbe 5

这与返回类型无关,而是与您将函数声明为返回单行这一事实有关。

代替

RETURNS users
Run Code Online (Sandbox Code Playgroud)

RETURNS SETOF users
Run Code Online (Sandbox Code Playgroud)

并且您的功能将按预期工作。

正如您的函数一样,如果查询没有结果,它将返回 NULL,如果查询有多个结果行,它将返回第一行。