Функции PostgreSQL - Сравнение с потенциально нулевым аргументом - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть упрощенная функция, определенная примерно так (многие столбцы и параметры удалены):

CREATE OR REPLACE FUNCTION write_no_duplicates(
      IN p_foreign_key BIGINT
    , IN p_write_value TEXT
    , OUT output my_table
)
LANGUAGE plpgsql AS $$
BEGIN
    SELECT *
    INTO STRICT output
    FROM my_table
    WHERE my_table.foreign_key = p_foreign_key
    AND (my_table.write_value = p_write_value
        OR (my_table.write_value IS NULL AND p_write_value IS NULL));
EXCEPTION WHEN NO_DATA_FOUND THEN
    INSERT INTO my_table (foreign_key, write_value)
    VALUES (p_foreign_key, p_write_value)
    RETURNING *
    INTO STRICT output;
END $$;

Цель функции - написать новую строку, но предотвратить дублирование.Мы не используем уникальное ограничение из-за размера и ширины таблицы, и мы не возражаем, если запись будет медленнее.

Мой вопрос состоит из двух частей:

  • Есть ли лучший способ выполнить нулевое сравнение?
  • Есть ли лучший способ обеспечить уникальность?

Спасибо, что уделили время!

...