PostgreSQL自定义拼接字段函数调用报错:column 'f_name' does not exist 求助
问题解决
错误原因分析
- 函数内部逻辑错误:你定义的函数接收
f_name和l_name作为参数,但函数体里却直接引用cust.f_name和cust.l_name——这个函数是独立的标量函数,并非绑定到cust表,所以应该使用传入的参数名,而非表的列名。 - 函数调用方式错误:你执行
SELECT * FROM fn_concat(f_name, l_name);时,没有指定从cust表读取字段,PostgreSQL会认为f_name是当前上下文的独立列,而实际不存在,因此报错。
修正后的函数
先修改函数,将内部的表前缀去掉,直接使用传入的参数:
CREATE OR REPLACE FUNCTION fn_concat(f_name character varying, l_name character varying) RETURNS character varying AS $$ BEGIN IF f_name IS NULL AND l_name IS NULL THEN RETURN NULL; ELSEIF f_name IS NULL AND l_name IS NOT NULL THEN RETURN l_name; ELSEIF f_name IS NOT NULL AND l_name IS NULL THEN RETURN f_name; ELSE RETURN CONCAT(f_name, ' ', l_name); END IF; END; $$ LANGUAGE plpgsql;
正确的调用语句
从cust表中查询数据,同时将f_name和l_name作为参数传入函数:
SELECT cus_id, fn_concat(f_name, l_name) AS fn_concat, email FROM cust;
可选优化方案
其实PostgreSQL提供了更简洁的内置函数可以实现相同逻辑,不需要自定义函数:
- 使用
CONCAT_WS(自动处理NULL,用指定分隔符拼接):
SELECT cus_id, CONCAT_WS(' ', f_name, l_name) AS fn_concat, email FROM cust;
CONCAT_WS会自动忽略NULL值,如果其中一个字段为NULL,只会返回非NULL的那个字段;如果都为NULL则返回NULL,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Student_OKIE
相关产品推荐
相关产品推荐

