1

我有以下表格:

CREATE TABLE public.permissions (
    "user" varchar ,
    "action" permissions_action_enum, -- 'read'/'write'
    id ltree
);

CREATE TABLE public.items (
    "path" ltree NULL,
    id uuid NOT NULL,
);

我想返回用户有权查看的所有行,如果用户有权访问该项目或其祖先之一,则他有权访问该项目。例如:

public.permissions:
user       |action|id |
-----------|------|---|
1          |read  |a  |
1          |read  |d  |


public.items:
path       |id |
-----------|---|
a.b        |b  |
a.c        |c  |
e.d        |d  |
g.f        |f  |

根据以上数据,用户对项目(b、c、d)有权限。

我想创建一个连接上述表的查询并返回用户有权访问的所有项目,read预期结果是:

path       |id |
-----------|---|
a.b        |b  |
a.c        |c  |
e.d        |d  |

有一种有效的方法来搜索是否ltree包含其他ltree?或者如果ltree是另一个条目的孩子?*.a.*类似在lquery列之间但在列之间的东西。

我尝试使用<@/@>,但它们仅适用于检查根/项目:

select 'a.b'::ltree <@ 'b'::ltree -- false
select 'a.b'::ltree <@ 'a'::ltree -- true
select 'a.b'::ltree @> 'b'::ltree -- false
select 'a.b'::ltree @> 'a'::ltree -- false
4

1 回答 1

0

请使用以下查询,

select i.path, i.id from items i
inner join permissions p
on ((p.id = substr(i.path, 0,1)) or (p.id = substr(i.path, instr(i.path,'.') +1,1)));
于 2020-05-27T12:51:19.730 回答