返回带有空值的 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)