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

Kev*_*iss 3 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;
Run Code Online (Sandbox Code Playgroud)

是否有任何postgres功能可以让我摆脱is_admin函数?基本上检查行类类型(在继承方面)?

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

Cra*_*ger 6

您可以使用tableoid隐藏的列本.

SELECT tableoid, * FROM users;
Run Code Online (Sandbox Code Playgroud)

或者在这种情况下:

SELECT tableoid = 'admins'::regclass AS is_admin, * FROM users;
Run Code Online (Sandbox Code Playgroud)

但请注意,如果您想要找到非叶子成员资格,即如果存在superusers继承的会员资格,则会出现可怕的情况admins,超级用户将在此处报告为is_adminfalse.

AFAIK没有测试"是关系或任何子关系的成员",但如果你真的有这个,你可以通过子查询获得所有子关系的oid,做一个tableoid IN (SELECT ...).