Postgres INSERT IF 参数不为空



我有一个接受参数的函数,如果它不为空,我只想将该参数插入表中。我正在尝试这样的事情:

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$;

最新更新