You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中表名为name时自定义函数调用报错如何解决?

你遇到的问题根源和name的特殊身份有关:PostgreSQL本身存在内置name数据类型,你定义函数时参数写的n name会被优先解析为内置类型,而非你name表对应的复合行类型,导致实际调用时传入public.name行类型找不到匹配签名的函数。

解决方案

只需要在定义函数时,明确指定参数的类型是你的表对应的复合类型即可,有两种常用写法:

方法1:加模式名限定

函数定义的参数部分明确加表所属的模式(默认一般是public,可按实际情况修改):

CREATE OR REPLACE FUNCTION compile_name_search_terms(n public.name) RETURNS text AS $$
BEGIN
  return n.id || ' ' ||
    COALESCE(n.full_name, '') || ' ' ||
    COALESCE(n.phone, '') || ' ' || 
    regexp_replace(COALESCE(n.phone, ''), '[\(\)-]', '', 'g');
END
$$ LANGUAGE plpgsql;

方法2:用双引号包裹表名

强制PostgreSQL将name解析为标识符(你的表名)而非内置类型:

CREATE OR REPLACE FUNCTION compile_name_search_terms(n "name") RETURNS text AS $$
BEGIN
  return n.id || ' ' ||
    COALESCE(n.full_name, '') || ' ' ||
    COALESCE(n.phone, '') || ' ' || 
    regexp_replace(COALESCE(n.phone, ''), '[\(\)-]', '', 'g');
END
$$ LANGUAGE plpgsql;

修改完成后再执行原来的查询语句即可正常运行:

SELECT id, compile_name_search_terms(t) FROM name AS t;

内容的提问来源于stack exchange,提问作者StillLearnin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:54:02