尝试使用 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 响应时出现未捕获(承诺)错误

使用 CASE WHEN 语句时出现 RODBC“无效字符\n”错误

尝试从节点应用程序连接时出现 PostgreSQL 错误

尝试使用 JWT 创建登录时出现“不是函数”错误

为啥当我尝试在 MariaDB 数据库上创建此函数(使用点数据类型)时出现此错误?