PostgreSQL函数处理varchar类型城市名时报错求助
问题解决:调用PostgreSQL函数时城市名字符串参数报错
错误根源
你调用函数时写的SELECT public.country_by_city(Abha);里,Abha没有用单引号包裹,PostgreSQL会把它当作列名标识符,而不是字符串常量,所以才会抛出ERROR: column "abha" does not exist的错误。这和UPPER()/INITCAP()无关——因为参数根本没被当成字符串处理。
正确调用方式
必须用单引号把城市名字符串括起来,明确告诉PostgreSQL这是字符串常量:
SELECT public.country_by_city('Abha');
为什么用city_id能正常工作?
当你用city_id作为查询条件时,传入的是数字值(比如SELECT public.country_by_city(123);),数字类型的常量不需要引号,PostgreSQL能直接识别为数值,所以不会触发标识符解析的错误。
额外优化:大小写不敏感匹配
如果想让函数支持忽略大小写的匹配(比如输入abha、ABHA都能找到结果),可以在函数里统一转换大小写:
CREATE OR REPLACE FUNCTION public.country_by_city(city varchar, OUT Country varchar) RETURNS varchar LANGUAGE SQL AS $function$ SELECT c.country FROM country c JOIN city c2 ON c2.country_id = c.country_id WHERE UPPER(c2.city) = UPPER($1) $function$ ;
调用时依然要记得用单引号包裹字符串参数,比如SELECT public.country_by_city('abha');。
内容的提问来源于stack exchange,提问作者lowercase male
相关产品推荐
相关产品推荐

