我正在尝试在Postgres中创建一个函数,如果行不存在就插入一行并返回该行的ID(新创建的或已存在的)。
我想到了以下代码:
CREATE OR REPLACE FUNCTION
get_enttype(name character varying, module character varying)
RETURNS integer LANGUAGE SQL STABLE AS $$
SELECT typeid FROM enttypes WHERE name = $1 AND module = $2
$$;
CREATE OR REPLACE FUNCTION
ensure_enttype(name character varying, module character varying)
RETURNS integer LANGUAGE SQL AS $$
SELECT CASE WHEN get_enttype($1, $2) IS NULL
THEN
INSERT INTO enttypes(name, module) VALUES ($1, $2) RETURNING typeid
ELSE
get_enttype($1, $2)
END
$$;
然而,由于CASE
中包含INSERT
,所以它引发了一个语法错误。我成功解决了这个问题,通过创建一个带有INSERT
的单独函数,并在CASE
中使用此函数。它按预期工作,但这种修复方式似乎有些奇怪。我的问题是 - 我能否在不创建另一个函数的情况下解决这个问题?