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

问题描述 投票:0回答:1

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

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

有人可以解释一下为什么这行不通吗?对我来说没有意义...

postgresql plpgsql nullable
1个回答
1
投票

如果all的元素为NULL,则为IS NULL,如果all的元素为NULL,则为IS NOT NULL

SQL标准要求。

© www.soinside.com 2019 - 2024. All rights reserved.