如何编写循环条件以获取 postgresql 中的子子文件夹名称
Posted
技术标签:
【中文标题】如何编写循环条件以获取 postgresql 中的子子文件夹名称【英文标题】:how to write a loop condition for to get the sub sub folders name in postgresql 【发布时间】:2021-07-23 19:33:39 【问题描述】:我正在尝试获取子文件夹中的文件夹名称。
例子:
folder_id folder_name parent_folder_id
1 F1 0
2 F2 1
3 F3 2
4 F4 3
现在我正在尝试获取 f4 名称以及父文件夹名称,例如:F1/F2/F3/F4 我根据folder_id获取parent_folder_id并写了循环条件,这是我的函数。
for vrecord in (select parent_folder_id from public."VOfficeApp_filefolder"
where folder_id = ip_folder_id)
loop
return query
select (SELECT array_to_json(array_agg(row_to_json(b))) FROM
(select folder_name from public."VOfficeApp_filefolder"
where folder_id = v_id)b)as path;
结束循环;
【问题讨论】:
【参考方案1】:聚合函数不构建分层结果;为此,您需要RECURSIVE CTE。构建层次结构后,您可以转换为 json。下面的函数就是这样做的。该函数采用您感兴趣的文件夹名称,毕竟它只使用at the last minuet
来消除构建的其余层次结构。
create or replace function path_to_folder(target_folder_name text)
returns json
language sql
as $$
with recursive folder_path (id, folder_name, path) as
( select folder_id, folder_name,folder_name || '/'
from folders
where parent_folder_id = 0
union all
select f.folder_id, f.folder_name, fp.path || f.folder_name || '/'
from folders f
join folder_path fp on (f.parent_folder_id = fp.id)
)
, bjc (folder_name, path) as
( select folder_name, path
from folder_path
where folder_name = target_folder_name
) -- select * from bjc;
select json_agg(row_to_json((folder_name, path)))
from bjc
group by folder_name;
$$;
注意:可能不需要第二个 cte bjc(在 Json 转换之前),但因为我讨厌 json(恕我直言,我不想处理复杂性)。您可以将 where 子句从它移到 json 构造中。但我总是喜欢在转换之前看到结果。
旁注: Postgres 9.2 已过时。已于 2017 年 11 月停止支持。您应该认真更新。
【讨论】:
以上是关于如何编写循环条件以获取 postgresql 中的子子文件夹名称的主要内容,如果未能解决你的问题,请参考以下文章
如何从 postgresql 10.3 中的这个多重连接查询中删除嵌套循环
如何获取 PostgreSQL 数据库中的函数列表及其参数?