Я пытался сделать что-то подобное, чтобы обновить / вставить некоторые записи, в которых числовое значение может быть нулевым или нет.Вы можете проверить переменную перед тем, как отправить ее в функцию или в функцию, в зависимости от переданного значения (для меня лучше использовать переменную, чем использовать CASE WHEN THEN ELSE END CASE каждый раз, когда вам нужно проверить значение)
Таким образом, чтобы работать со значениями NULL, используя обычный операнд сравнения, чтобы найти запись для обновления, можно сделать, установив transform_null_equals в положение ON
Я надеюсь, что это поможет кому-то
CREATE OR REPLACE FUNCTION update_insert_transaction(vcodaccount integer, vcodaccountaux text,
vdescription text, vcodgroup integer)
RETURNS integer AS $$
DECLARE
n integer = 0;
vsql text = 'NULL';
BEGIN
IF vcodaccountaux <> '' THEN
vsql = vcodaccountaux;
END IF;
SET LOCAL transform_null_equals TO ON;
EXECUTE 'UPDATE account_import_conf SET (codaccount, codaccountaux, description, codgroup) =
('||vcodaccount||','||vsql||',trim('||quote_literal(vdescription)||'),'||vcodgroup||')
WHERE codaccount='||vcodaccount||' AND codaccountaux = '||vsql||' RETURNING * ';
GET DIAGNOSTICS n = ROW_COUNT;
IF n = 0 THEN
EXECUTE 'INSERT INTO account_import_conf (codaccount, codaccountaux, description, codgroup)
SELECT '||vcodaccount||','||vsql||' ,trim('||quote_literal(vdescription)||'),'||vcodgroup||';';
END IF;
RETURN n;
END;$$
LANGUAGE plpgsql;