自定义类型的奇怪 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 标准所要求的。
我正在尝试创建一个函数,该函数应将 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 标准所要求的。