Postgres INSERT IF参数不为null

时间:2018-10-16 13:17:40

标签: postgresql

我有一个带有参数的函数,并且我只想在不为空的情况下将该参数插入表中。我正在尝试这样的事情:

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

因此,看起来它仍在尝试将其插入。我该如何纠正这种情况?

2 个答案:

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