自定义类型的奇怪PostgreSQL空检查行为

自定义类型的奇怪PostgreSQL空检查行为,postgresql,plpgsql,nullable,Postgresql,Plpgsql,Nullable,我正在尝试创建一个函数,该函数应该将表行映射到我的自定义类型,并作为结果返回它。如果该表中的某列为NULL,则不为NULL检查我的自定义类型不起作用!检查示例: 我有一个简单的自定义类型: CREATE TYPE my_custom_type AS ( sender VARCHAR(30), destination VARCHAR(30), count INTEGER ); 和一张桌子: CREATE TABLE messages ( id INTEGER PRIMARY KE

我正在尝试创建一个函数,该函数应该将表行映射到我的自定义类型,并作为结果返回它。如果该表中的某列为NULL,则不为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();

但当某些列被更新为NULL时,奇怪的事情开始发生:

UPDATE messages SET destination = NULL;
当我再次执行该函数时,它仍然返回良好的结果:

但如果我将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;
然后我得到一个错误: 错误:无数据


有人能解释一下为什么这不起作用吗?这对我来说毫无意义……

如果所有的元素都为空,那么复合类型
为空,如果所有的元素都不为空,那么它
就不为空

这是SQL标准所要求的