PostgreSQL声明返回JSON变量的函数报错求助
解决PostgreSQL函数返回JSON时的"column不存在"错误
错误原因
你遇到的ERROR: column "{ 'stat' : 'inactive' }" does not exist错误,是因为在PL/pgSQL中使用双引号"包裹JSON字符串时,PostgreSQL会将双引号内的内容识别为数据库对象(列、表等)的名称,而非字符串常量,所以才会误把你的JSON当成列名查找。
修复方案
方案1:修正字符串引用与类型转换
将双引号替换为单引号包裹JSON字符串,并显式转换为JSON类型,同时优化查询逻辑(用EXISTS替代低效的嵌套COUNT查询):
CREATE OR REPLACE FUNCTION login(uname character varying(55), pswd character varying(55)) RETURNS json AS $$ DECLARE msg json; BEGIN -- 用EXISTS判断用户是否存在,找到匹配行即停止扫描,效率更高 IF EXISTS (SELECT 1 FROM users WHERE username = uname AND password = pswd) THEN msg := '{"stat": "active"}'::json; RETURN msg; ELSE msg := '{"stat": "inactive"}'::json; RETURN msg; END IF; END; $$ LANGUAGE plpgsql;
方案2:用内置函数构造JSON(推荐)
使用PostgreSQL内置的json_build_object函数直接构造JSON对象,避免手动拼接字符串的引号转义问题,更安全规范:
CREATE OR REPLACE FUNCTION login(uname character varying(55), pswd character varying(55)) RETURNS json AS $$ BEGIN IF EXISTS (SELECT 1 FROM users WHERE username = uname AND password = pswd) THEN RETURN json_build_object('stat', 'active'); ELSE RETURN json_build_object('stat', 'inactive'); END IF; END; $$ LANGUAGE plpgsql;
额外说明
- PL/pgSQL中赋值运算符推荐用
:=,比=更清晰(虽然=也能运行,但:=是PL/pgSQL标准赋值符号) EXISTS查询比COUNT(*)更高效,因为它不需要统计所有匹配行数,只要找到第一行就返回结果
内容的提问来源于stack exchange,提问作者Rune
相关产品推荐
相关产品推荐

