我有一个带有参数的函数,并且我只想在不为空的情况下将该参数插入表中。我正在尝试这样的事情:
CREATE OR REPLACE FUNCTION app.some_function(
my_param integer)
RETURNS void
LANGUAGE 'sql'
COST 100
VOLATILE
AS $BODY$
INSERT INTO app.myTable(something)
VALUES(my_param)
ON CONFLICT(something) DO
UPDATE
SET --someConflictLogic
WHERE my_param <> '' AND my_param IS NOT NULL;
$BODY$;
我希望这里的WHERE子句可以解决我的问题,但事实并非如此。当我使用my_param作为NULL调用此函数时,得到:
null value in column "something" violates not-null constraint
因此,看起来它仍在尝试将其插入。我该如何纠正这种情况?
答案 0 :(得分:2)
您可以打开insert ... values () into an
插入... select并附加where子句:
CREATE OR REPLACE FUNCTION app.some_function(my_param integer)
RETURNS void
LANGUAGE sql
VOLATILE
AS
$BODY$
INSERT INTO app.myTable(something)
select my_param
where my_param IS NOT NULL
and my_param <> ''
ON CONFLICT(something) DO
UPDATE
SET --someConflictLogic;
$BODY$;
您使用的where
子句仅适用于DO UPDATE
部分,而不适用于“主要”插入部分。
无关,但是:函数语言的名称是一个标识符。应该用引号引起来。
答案 1 :(得分:2)
您可以使用IF..THEN
并更改为plpgsql函数
CREATE OR REPLACE FUNCTION app.some_function(
my_param integer)
RETURNS void
LANGUAGE plpgsql
COST 100
VOLATILE
AS $BODY$
IF NULLIF(my_param,'') IS NOT NULL THEN
INSERT INTO app.myTable(something)
VALUES(my_param)
ON CONFLICT(something) DO
UPDATE
SET --someConflictLogic;
END IF;
$BODY$;