【问题标题】:Postgres INSERT IF parameter is not nullPostgres INSERT IF 参数不为空
【发布时间】:2018-10-16 13:17:40
【问题描述】:

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

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

所以看起来它仍在尝试插入它。我该如何纠正这种情况?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您可以将 insert ... values () into aninsert ... 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 部分,而不适用于“主要”插入部分。


    不相关,但是:函数语言的名称是一个标识符。它应该被引用。

    【讨论】:

      【解决方案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$;
      

      【讨论】:

        猜你喜欢
        • 2017-02-14
        • 1970-01-01
        • 2017-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-12
        • 2021-10-22
        相关资源
        最近更新 更多