为什么在我的 Postgres 函数中使用 IF 语句时会出现语法错误?

Why am I getting a syntax error when using an IF statement in my Postgres function?

我正在创建一个函数,允许我有条件地更新 table 中的特定列。但是,当我尝试 运行 以下代码时,我收到一条错误消息,指出“IF”处或附近存在语法错误。我对 Postgres 有点陌生,所以很有可能。我无法理解 Postgres 中的一些 concept/syntax 东西。有人可以帮我指出我一定犯的错误吗?

CREATE OR REPLACE FUNCTION profiles.do_something(
        p_id UUID,
        p_condition1 BOOLEAN,
        p_condition2 BOOLEAN,
        p_condition3 BOOLEAN
    ) 
RETURNS void AS $$
BEGIN

    IF p_condition1 IS TRUE THEN
        UPDATE tablename SET column1 = null WHERE member_id = p_id;
    END IF;

    IF p_condition2 IS TRUE THEN
        UPDATE tablename SET column2 = null WHERE member_id = p_id;
    END IF;

    IF p_condition3 IS TRUE THEN
        UPDATE tablename SET column3 = null WHERE member_id = p_id;
    END IF;

END;
$$ LANGUAGE 'sql';

tl;dr $$ LANGUAGE 'plpgsql'

$$ LANGUAGE 'sql';
            ^^^^^

你告诉它把函数体解析为 sql。在SQL中,begin是一条启动事务的语句。

create or replace function test1()
returns void
language sql
as $$
-- In SQL, begin starts a transaction.
-- note the ; to end the statement.
begin;
    -- Do some valid SQL.
    select 1;
-- In SQL, end ends the transaction.
end;
$$;

在 SQL 中你写了 begin if ... 这是一个语法错误。

您使用的语言是plpgsql。在 plpgsql 中,begin 是开始一个块的关键字。

create or replace function test1()
returns void
language plpgsql
as $$
-- In PL/pgSQL, begin starts a block
-- note the lack of ;
begin
    -- Do some valid SQL.
    select 1;
-- In PL/pgSQL, end ends the block
end;
$$;