我正在尝试创建一个函数,该函数应将表行映射到我的自定义类型并作为结果返回。如果该表中的某些列为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();
但是当某些列更新为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;
然后我得到一个错误:错误:无数据
有人可以解释一下为什么这行不通吗?对我来说没有意义...
如果all的元素为NULL,则为IS NULL
,如果all的元素为NULL,则为IS NOT NULL
。
SQL标准要求。