当 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 第一行。
如果我创建一个查询函数的函数 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 第一行。