Postgres INSERT IF параметр не равен NULL - PullRequest
0 голосов
/ 16 октября 2018

У меня есть функция, которая принимает параметр, и я хочу вставить этот параметр в таблицу, только если он не нулевой.Я пытаюсь что-то вроде этого:

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 голосов
/ 16 октября 2018

Вы можете использовать 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$;
0 голосов
/ 16 октября 2018

Вы можете включить insert ... values () into an insert ... 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, а не к "основной "вставить часть.


Не связано, но: название языка функций является идентификатором.Это должно быть указано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...