采取以下查询:
CREATE TEMP TABLE users
(
user_id SERIAL,
name varchar(50)
);
CREATE TEMP TABLE admins
(
section integer
) INHERITS(users);
INSERT INTO users (name) VALUES ('Kevin');
INSERT INTO admins (name, section) VALUES ('John', 1);
CREATE FUNCTION pg_temp.is_admin(INTEGER) RETURNS BOOLEAN AS
$$
DECLARE
result boolean;
BEGIN
SELECT INTO result COUNT(*) > 0
FROM admins
WHERE user_id = $1;
RETURN result;
END;
$$
LANGUAGE PLPGSQL;
SELECT name, pg_temp.is_admin(user_id) FROM users;
是否有任何postgres功能可以让我摆脱is_admin函数?基本上检查行类类型(在继承方面)?
我理解桌面设计并不理想,这只是提供一个简单的例子,以便我可以了解我所追求的是否可能。
答案 0 :(得分:6)
您可以使用the tableoid
hidden column for this。
SELECT tableoid, * FROM users;
或在这种情况下:
SELECT tableoid = 'admins'::regclass AS is_admin, * FROM users;
但是,请注意,如果您想要找到非叶成员资格,即如果superusers
继承自admins
,则可能会崩溃。超级用户将在此处报告is_admin
false。
AFAIK没有对“是关系的成员或任何子关系”的测试,但是如果你真的没有,你可以通过子查询得到所有子关系的oid,做tableoid IN (SELECT ...)
。