我正在尝试在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
$$;
但由于INSERT
内CASE
,因此会引发语法错误。我设法通过使用此INSERT
创建一个单独的函数并在CASE
中使用此函数来解决此问题。它按预期工作,但这个修复似乎有点奇怪。我的问题是 - 我可以在不创建其他功能的情况下修复此问题吗?
答案 0 :(得分:2)
不,您无法在INSERT
函数中使用CASE
内的sql
。但是你可以:
IF ... ELSE ... END
语句的PL / PgSQL函数;或INSERT INTO ... SELECT
查询答案 1 :(得分:1)
Pure SQL可以做到:
create or replace function ensure_enttype(
name character varying, module character varying
) returns integer language sql as $$
insert into enttypes(name, module)
select $1, $2
where get_enttype($1, $2) is null
;
select get_enttype($1, $2);
$$;