尝试使用 if 语句创建函数时出现 Postgresql 语法错误

Postgresql syntax error while trying to create function with if statement

我是 postgresql 的新手。所以,我正在尝试创建一个函数,但收到的错误消息为

错误:"IF" 第 7 行或其附近的语法错误:IF areaname = NULL OR pincode = NULL THEN

我参考了这个

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;

我知道这会是个愚蠢的错误,但请帮帮我。

returning用于声明函数的return类型。为了实际 return 值,您应该使用 return:

IF areaname IS NULL OR pincode IS NULL THEN 
    RETURN false; -- Here!
ELSE
    -- etc.

SQL中没有IF,如果需要,必须使用language plpgsql。而要return一个值,你需要使用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$;

我还强烈建议停止使用带引号的标识符,它们在长 运行 中带来的麻烦远远超过它们的价值。