首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres ltree有一个子查询

Postgres ltree有一个子查询
EN

Stack Overflow用户
提问于 2020-05-27 20:16:09
回答 1查看 251关注 0票数 1

我有以下表格:

代码语言:javascript
复制
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,
);

我希望返回用户有权查看的所有行,如果用户对某项或其祖先之一具有权限,则该用户对该项具有权限。例如:

代码语言:javascript
复制
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权限的所有项,预期的结果是:

代码语言:javascript
复制
path       |id |
-----------|---|
a.b        |b  |
a.c        |c  |
e.d        |d  |

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

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2020-05-27 20:51:20

请使用以下查询,

代码语言:javascript
复制
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)));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62042924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档