我有一个接受参数的函数,如果它不为空,我只想将该参数插入表中。我正在尝试这样的事情:
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
所以看起来它仍在尝试插入它。如何纠正这种情况?
您可以转动insert ... values () into an
插入...选择",并附加一个 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
部件,不适用于"主要"插入部件。
不相关,但是:函数语言的名称是一个标识符。应该引用它。
您可以使用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$;