自定义类型的奇怪PostgreSQL空检查行为
我正在尝试创建一个函数,该函数应该将表行映射到我的自定义类型,并作为结果返回它。如果该表中的某列为NULL,则不为NULL检查我的自定义类型不起作用!检查示例: 我有一个简单的自定义类型:自定义类型的奇怪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
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标准所要求的