[英]how to write a loop condition for to get the sub sub folders name in postgresql
我正在尝试获取子文件夹中的文件夹名称。
例子:
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;
结束循环;
聚合函数不构建分层结果; 为此,您需要一个RECURSIVE CTE 。 构建层次结构后,您可以转换为 json。 下面的函数就是这样做的。 该函数采用您感兴趣的文件夹名称,毕竟它只at the last minuet
使用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 月停止支持。您应该认真更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.