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

Weird PostgreSQL null check behavior for custom types

我正在尝试创建一个函数,该函数应将 table 行映射到我的自定义类型,结果是 return。如果 table 中的某些列为 NULL,则 IS NOT NULL 检查我的自定义类型不起作用!检查示例:

我有一个简单的自定义类型:

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

还有一个table:

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

为此示例插入单行:

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

现在我想创建一个函数,它将 return 该行作为自定义 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;

当我再次执行该函数时,它仍然是return的好结果:

但是如果我将 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;

然后我得到一个错误: 错误:没有数据

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

一个复合类型 IS NULL if all its elements are NULL, and it IS NOT NULL if all elements不为 NULL。

这是 SQL 标准所要求的。