尝试使用 if 语句创建函数时出现 Postgresql 语法错误
Posted
技术标签:
【中文标题】尝试使用 if 语句创建函数时出现 Postgresql 语法错误【英文标题】:Postgresql syntax error while trying to create function with if statement 【发布时间】:2020-01-25 07:31:22 【问题描述】:我是 postgresql 的新手。所以,我正在尝试创建一个函数,但我收到的错误消息是
错误:“IF”第 7 行或附近的语法错误:IF areaname = NULL OR pincode = NULL THEN
我推荐了这个link。
CREATE FUNCTION location."fn_updateInArea"(area_id integer, areaname text, pincode text)
RETURNS boolean
LANGUAGE 'sql'
AS $BODY$
BEGIN
IF areaname IS NULL OR pincode IS NULL THEN
RETURNING false;
ELSE
UPDATE location.areainfo SET
area_name=CASE WHEN (areaname) IS NULL THEN (SELECT area_name from location.areainfo WHERE id=area_id) ELSE area_name END,
pin_code=CASE WHEN (pincode) IS NULL THEN (SELECT pin_code from location.areainfo WHERE id=area_id) ELSE pin_code END
WHERE id=area_id AND "deleteIndex"=false;
RETURNING true;
END IF;
END;
$BODY$;
ALTER FUNCTION location."fn_updateInArea"(integer, text, text)
OWNER TO postgres;
我知道这是个愚蠢的错误,但请帮帮我。
【问题讨论】:
【参考方案1】:SQL 中没有IF
,如果需要,您必须使用language plpgsql
。而要返回一个值,你需要使用return
,而不是returning
。
您也不需要 SELECT 语句来访问要更新的行中列的值,只需直接引用该列即可。您可以将 CASE 表达式简化为简单的 coalesce()
CREATE FUNCTION location."fn_updateInArea"(p_area_id integer, p_areaname text, p_pincode text)
RETURNS boolean
LANGUAGE plpgsql --<< Here
AS $BODY$
BEGIN
IF p_areaname IS NULL OR p_pincode IS NULL THEN
RETURN false; --<< use RETURN not RETURNING
ELSE
UPDATE location.areainfo
SET area_name = coalesce(p_areaname, area_name)
pin_code = coalesce(p_pincode, pin_code)
WHERE id=area_id
AND "deleteIndex"=false;
RETURN true;
END IF;
END;
$BODY$;
我还强烈建议停止使用带引号的标识符,从长远来看,它们带来的麻烦比它们的价值要大得多。
【讨论】:
【参考方案2】:returning
用于声明函数的返回类型。为了真正返回值,你应该使用return
:
IF areaname IS NULL OR pincode IS NULL THEN
RETURN false; -- Here!
ELSE
-- etc.
【讨论】:
以上是关于尝试使用 if 语句创建函数时出现 Postgresql 语法错误的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 if 语句中检查 json 响应时出现未捕获(承诺)错误