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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:10:23