当 return 类型是 table 名称时,为什么 PostgreSQL 函数 return 空列而不是无行?

Why do PostgreSQL functions return null columns instead of no rows when the return type is a table name?

如果我创建一个查询函数的函数 f 我认为如果 return 类型是 table 而不是 [=18= 的名称,它会变得更容易阅读].

CREATE TABLE users ( id integer, name text );

CREATE OR REPLACE FUNCTION f() 
 RETURNS users 
 AS $$ 
   SELECT * FROM users
   WHERE FALSE 
 $$ 
 LANGUAGE SQL;

但是当函数中的查询是 return 零行时,我得到了奇怪的结果。

SELECT * FROM f();

预期结果

+------+--------+
| id   | name   |
|------+--------|
+------+--------+

实际结果

+--------+--------+
| id     | name   |
|--------+--------|
| <null> | <null> |
+--------+--------+

如果有更多的列,它们仍然都是 null。如果函数 returns 中的查询有任何行,那么它将按预期工作。如果我使用 RETURNS TABLE(...) 语法,我不会得到这种行为。

有办法解决这个问题吗?

我正在使用 PostgreSQL 9.6

这与 return 类型无关,但与您将函数声明为 return 单行这一事实有关。

替换

RETURNS users

RETURNS SETOF users

您的功能将按预期工作。

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