Странное PostgreSQL нулевое поведение при проверке пользовательских типов - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь создать функцию, которая должна сопоставить строку таблицы с моим пользовательским типом и вернуть ее в результате. Если какой-то столбец в этой таблице равен NULL, то NOT NOT NULL проверка моего пользовательского типа не работает! Проверьте пример:

У меня есть простой пользовательский тип:

CREATE TYPE my_custom_type AS (
  sender VARCHAR(30),
  destination VARCHAR(30),
  count INTEGER
);

И таблица:

CREATE TABLE messages (
  id INTEGER PRIMARY KEY,
  sender VARCHAR(30),
  destination VARCHAR(30),
  count INTEGER
);

Вставьте одну строку для этого примера:

INSERT INTO messages VALUES (1, 'sender', 'destination', 100);

И теперь я хочу создать функцию, которая будет возвращать эту строку как пользовательский тип Postgres:

CREATE OR REPLACE FUNCTION my_custom_function() 
RETURNS my_custom_type AS
$$
DECLARE
    result my_custom_type;
BEGIN

    SELECT sender, destination, count
    FROM messages
    LIMIT 1
    INTO result;

    IF result IS NULL THEN
        RAISE EXCEPTION 'no data';
    END IF;

    RETURN result;

END; $$
    LANGUAGE plpgsql;

Когда я использую эту функцию, я получаю хорошие результаты:

SELECT * from my_custom_function();

enter image description here

Но странные вещи начинают происходить, когда какой-то столбец обновляется до NULL:

UPDATE messages SET destination = NULL;

Когда я снова выполняю функцию, она все еще возвращает хорошие результаты: enter image description here

Но если я изменил условие IS NULL на условие IS NOT NULL:

CREATE OR REPLACE FUNCTION my_custom_function() 
RETURNS my_custom_type AS
$$
DECLARE
    result my_custom_type;
BEGIN

    SELECT sender, destination, count
    FROM messages
    LIMIT 1
    INTO result;

    IF result IS NOT NULL THEN
        RETURN result;
    END IF;

    RAISE EXCEPTION 'no data';

END; $$
    LANGUAGE plpgsql;

Тогда я получил ошибку: ОШИБКА: нет данных

Может кто-нибудь объяснить, почему это не работает? Это не имеет смысла для меня ...

1 Ответ

1 голос
/ 14 февраля 2020

Составной тип IS NULL, если все , его элементы имеют значение NULL, а IS NOT NULL, если , все элементы не равны NULL.

Требуется для SQL стандарт.

...