返回带有空值的 Table 会导致错误
Returning Table with null value causes error
我有一个带有可选参数的简单函数。当我遗漏一个应该默认为 null 的参数时,我收到一条错误消息,指出它不是整数。
函数如下:
CREATE FUNCTION rewrite(_postid integer DEFAULT NULL::integer,
_url character varying DEFAULT NULL::character varying)
RETURNS TABLE
(
PostTypeID integer,
DestinationURL varchar,
)
LANGUAGE plpgsql
AS
$function$
BEGIN
RETURN QUERY
SELECT
NULL AS PostTypeID,
_url AS DestinationURL,
FROM reference.destinations dest1
WHERE length(TRIM(dest1.DestinationURL)) > 0
AND _url LIKE '%' || TRIM(dest1.DestinationURL)) || '%'
ORDER BY length(dest1.DestinationURL)) DESC
LIMIT 1;
END;
$function$
如果我 运行 SELECT * FROM utility.rewrite(_url := 'wikipedia.org')
然后我得到这个错误:
[42804] ERROR: structure of query does not match function result type
Detail: Returned type text does not match expected type integer in
column 1.
所以 column1
必须是我的 RETURNS TABLE
定义中的 PostTypeID
列。但是我选择 NULL AS PostTypeID
那么为什么它不只是返回 NULL?
如果我 运行 SELECT * FROM utility.rewrite(_postid = 0, _url := 'wikipedia.org')
那么它工作正常。但是我不想返回0
,我想要NULL。
仅仅因为您在查询中使用别名 posttypeid
并不意味着 PostgreSQL 推断出您的 PL/pgSQL 变量的数据类型。
尽管 NULL 可以是任何数据类型,但 PostgreSQL 必须确定查询结果列的数据类型。缺少其他信息,它任意选择 text
.
将查询结果类型映射到函数结果类型稍后发生,在 PL/pgSQL 中。这就是导致您观察到的错误的原因。
您可以通过使用显式类型转换指定 NULL 的类型来避免此问题:
SELECT CAST (NULL AS integer)
我有一个带有可选参数的简单函数。当我遗漏一个应该默认为 null 的参数时,我收到一条错误消息,指出它不是整数。
函数如下:
CREATE FUNCTION rewrite(_postid integer DEFAULT NULL::integer,
_url character varying DEFAULT NULL::character varying)
RETURNS TABLE
(
PostTypeID integer,
DestinationURL varchar,
)
LANGUAGE plpgsql
AS
$function$
BEGIN
RETURN QUERY
SELECT
NULL AS PostTypeID,
_url AS DestinationURL,
FROM reference.destinations dest1
WHERE length(TRIM(dest1.DestinationURL)) > 0
AND _url LIKE '%' || TRIM(dest1.DestinationURL)) || '%'
ORDER BY length(dest1.DestinationURL)) DESC
LIMIT 1;
END;
$function$
如果我 运行 SELECT * FROM utility.rewrite(_url := 'wikipedia.org')
然后我得到这个错误:
[42804] ERROR: structure of query does not match function result type Detail: Returned type text does not match expected type integer in column 1.
所以 column1
必须是我的 RETURNS TABLE
定义中的 PostTypeID
列。但是我选择 NULL AS PostTypeID
那么为什么它不只是返回 NULL?
如果我 运行 SELECT * FROM utility.rewrite(_postid = 0, _url := 'wikipedia.org')
那么它工作正常。但是我不想返回0
,我想要NULL。
仅仅因为您在查询中使用别名 posttypeid
并不意味着 PostgreSQL 推断出您的 PL/pgSQL 变量的数据类型。
尽管 NULL 可以是任何数据类型,但 PostgreSQL 必须确定查询结果列的数据类型。缺少其他信息,它任意选择 text
.
将查询结果类型映射到函数结果类型稍后发生,在 PL/pgSQL 中。这就是导致您观察到的错误的原因。
您可以通过使用显式类型转换指定 NULL 的类型来避免此问题:
SELECT CAST (NULL AS integer)