【问题标题】:How to filter by path with PostgreSQL如何使用 PostgreSQL 按路径过滤
【发布时间】:2022-06-10 20:29:46
【问题描述】:

我的数据库中有一些资源被继承到它们的子资源。当我查询资源时,我还需要能够获取继承的资源。我有一个名为path 的字段,我打算使用它。 path 始终包含与我们当前正在处理的资源相关的所有资源的完整路径。

例子:

+-----------------------------------------+
| id | res_id    | path                   |
|-----------------------------------------|
| 1  | res_1     | res_1                  |
| 2  | res_1.1   | res_1.res_1.1          |
| 3  | res_1.2   | res_1.res_1.2          |
| 4  | res_1.1.1 | res_1.res_1.1.res_1.1.1|
+-----------------------------------------+

如果我查询res_1.1,我还必须得到res_1,因为它是res_1.1 的父级。如果我得到res_1.1.1,我还必须得到第1 行和第2 行,因为它们包含在res_1.1.1 的路径中。希望有一些建议如何使用 Postgres 做到这一点。如果这是重要信息,我还使用sqlmodel 编写查询。

【问题讨论】:

  • 请始终声明您的 Postgres 版本。所以你的模型不是递归的?你真的以这种模棱两可的方式使用点(.)吗?不能使用不同的分隔符吗?

标签: python sql postgresql pydantic sqlmodel


【解决方案1】:

虽然您遇到了不幸的模棱两可的分隔符,但拆分路径有点棘手。正则表达式应该这样做:

SELECT t.*
FROM  (
   SELECT regexp_split_to_table(path, '\.(?=\D)') AS res_id
   FROM   tbl
   WHERE  res_id = 'res_1.1.1'  -- your res_id here
   ) t1
JOIN  tbl t USING (res_id);

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多