1

我有一个带有可选参数的简单函数。当我遗漏一个默认为 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] 错误:查询结构与函数结果类型不匹配详细信息:返回类型文本与第 1 列中的预期类型整数不匹配。

所以column1必须是PostTypeIDRETURNS TABLE定义中的列。但是我选择NULL AS PostTypeID了为什么它不只是返回NULL?

如果我运行,SELECT * FROM utility.rewrite(_postid = 0, _url := 'wikipedia.org')那么它工作正常。但我不想0被退回,我想要 NULL。

4

1 回答 1

1

仅仅因为您在查询中使用别名posttypeid并不意味着 PostgreSQL 推断您的 PL/pgSQL 变量的数据类型。

即使 NULL 可以是任何数据类型,PostgreSQL 也必须确定查询的结果列的数据类型。缺少其他信息,它随意选择text

稍后在 PL/pgSQL 中将查询结果类型映射到函数结果类型。这就是导致您观察到的错误的原因。

您可以通过使用显式类型转换指定 NULL 的类型来避免该问题:

SELECT CAST (NULL AS integer)
于 2021-01-12T14:09:04.460 回答