从继承的表中获取每一行的表名

时间:2014-04-01 10:23:12

标签: postgresql

采取以下查询:

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函数?基本上检查行类类型(在继承方面)?

我理解桌面设计并不理想,这只是提供一个简单的例子,以便我可以了解我所追求的是否可能。

1 个答案:

答案 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 ...)