当在用oracle做递归时,往往会用到一个虚列level,表示当前的节点是第几层,现在PostgreSql的递归语法中(with recursive)中不包含层级列,当然你安装了PostgreSql的扩展也是可以的,就是安装cross这个脚本,具体在postgreSql安装目录项的share/extension下的tablefunc.sql,脚本。

由于在我实际的项目中不允许安装哪些脚本,因此只能先自定义一个函数,具体代码如下:

首先,创建自定义类型

CREATE TYPE public.type_custom_recursive AS (
  keyid TEXT,
  branch TEXT,
  parent_keyid TEXT,
  level TEXT
);

再创建函数:

CREATE OR REPLACE FUNCTION public.custom_recursive (
  table_name varchar,
  keyid text,
  parent_keyid text,
  keyid_value text,
  level integer,
  split_value varchar
)
RETURNS SETOF public.type_custom_recursive AS
$body$
declare
test_ type_custom_recursive;
    sql_text VARCHAR(1000);

BEGIN
-- i_id  as keyid,id as branch,level as level 
if $5 = 0 THEN
sql_text := 'select i_id::text as keyid,id::text as branch,i_parent_id::text as parent_keyid,level::text as level from (  
          with recursive temp as(
          select '||$2||' as i_id,'||$2||'::text as id ,'||$3||' from '|| $1 ||' where '||$2||' = cast('||$4||
          'as int) union all
          select b.'||$2||',cast (a.id || '''||split_value||''' || b.'||$2||' as text) as id,b.'||$3||'  from temp a,'||$1||' b
          where a.'||$2||' = b.'||$3||')select i_id,id,f_char_in_string(id,'''||$6||''')+1 as level,i_parent_id from temp
          ) t order by i_id';
          
else
sql_text := 'select i_id::text as keyid,id::text as branch,i_parent_id::text as parent_keyid,level::text as level from (  
          with recursive temp as(
          select '||$2||' as i_id,'||$2||'::text as id ,'||$3||' from '|| $1 ||' where '||$2||' = cast('||$4||
          'as int) union all
          select b.'||$2||',cast (a.id || '''||split_value||''' || b.'||$2||' as text) as id,b.'||$3||'  from temp a,'||$1||' b
          where a.'||$2||' = b.'||$3||')select i_id,id,f_char_in_string(id,'''||$6||''')+1 as level,i_parent_id from temp
          ) t  where level = '|| $5 ||' order by i_id';          
end if;

for test_ in execute sql_text loop
          return next test_;
  end loop;          
end;
$body$
LANGUAGE 'plpgsql';

说明:

table_name varchar ,--需要递归的表名
  keyid text,--id
  parent_keyid text,--父id
  keyid_value text,--id的值
  level integer,--层级 0的话显示当前id下的所有节点
  split_value varchar --  分隔符比如"->"

注意这里的id默认都是为整型的,如果id是varchar型那么需要稍作修改的。

下面做个小例:

select * from custom_recursive('organization','i_id','i_parent_id','1',0,'->');

输出为

keyid,branch,parentkeyid,level

1 ,1,null,1

2,1->2,1,2

3,1->3,1,2

PostgreSql递归包含层级level相关推荐

  1. php递归实现层级树状展开,PHP递归实现层级树状展开,php递归层级树状_PHP教程...

    PHP递归实现层级树状展开,php递归层级树状 本文实例为大家分享了PHP递归实现层级树状展开的主要代码,供大家参考,具体内容如下 效果图: 实现代码: $arr['id'], 'fid' => ...

  2. php 递归展现城市信息,PHP 递归兑现层级树状展现数据

    PHP 递归实现层级树状展现数据 ? $arr['id'], 'fid' => $arr['fid'], 'name' => $arr['name'], ); } // 将数据按照缩进简单 ...

  3. mysql php 封装类_PHP递归实现层级树状展开的方法

    这篇文章主要为大家详细介绍了PHP递归实现层级树状展开的相关资料,需要的朋友可以参考下 效果图: 实现代码: $db = mysql_connect('localhost', 'root', 'roo ...

  4. python读取包含层级关系的excel

    1.场景描述 使用python读取包含层级关系excel,数据示例如下图所示. 2.代码 import xlrd def read_excel():# 打开文件workbook = xlrd.open ...

  5. java解析mpp文件(包含层级关系)

    我用的是递归循环的,不限制有多少子级关系都可以拿到 首先引入解析mpp所需依赖 <dependency><groupId>net.sf.mpxj</groupId> ...

  6. PHP递归实现层级树状展现数据

    树状数据展现很常用,今天学习了PHP的递归,也来总结总结! PHP代码: function _getTreeList_custom1($data,$parent_id,$depth){$return_ ...

  7. SQL Server 实现递归获取层级数据

    经常会出现一个业务场景,当前已知ID,怎么获取他的子节点数据呢?怎么获取父节点的数据呢?下面用代码展示一个最简单的例子: /*创建一张员工表*/ CREATE TABLE [dbo].[Employe ...

  8. SQL Server 利用WITH AS递归获取层级关系数据

    WITH AS短语,也叫做子查询部分(subquery factoring),在SQL Server 2005中提供了一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性 ...

  9. oracle输出hello world,Oracle BIEE的开发讲解 从helloworld开始

    目录 创建资料库 BIEE的资料库(Repository)是一个后缀名为rpd的物理文件,其中存储了三类元数据:数据源物理模型,逻辑模型,以及展现模型. Oracle BI Server是资料库的使用 ...

最新文章

  1. 一举拿下高可用与分布式协调系统设计!
  2. torchvision0.2.2_速度全面碾压,PCIE4.0 M.2对撞PCIE3.0 M.2
  3. Faster RCNN原理分析(二):Region Proposal Networks详解
  4. 深入浅出 RPC - 浅出篇+深入篇
  5. android二级菜单实现,Android编程实现二级下拉菜单及快速搜索的方法
  6. JavaScript JSON.stringify()
  7. NAACL 2018 | 最佳论文:艾伦人工智能研究所提出新型深度语境化词表征
  8. LINUX报错:apt transaction returned result exit-failed
  9. Windows上传文件到CentOS系统
  10. HTML实现三级导航菜单栏
  11. 2020ubc大学计算机硕士录取条件,2020Fall录取|研究牛校UA阿尔伯塔大学计算机硕士两年全奖!...
  12. Redis基本数据类型,redis官网
  13. 新贵 轻雅 100 数字键 numlock问题
  14. 服务器开启虚拟控制台
  15. 解决No thread-bound request found: Are you referring to request attributes outside of an actual web.异常
  16. Redis中Set数据类型常用命令了解
  17. LeetCode 1-10 题 3、4、5、7、9、10
  18. python第三方库re库基本介绍
  19. 关于重定向和转发的理解
  20. springboot引入国际化

热门文章

  1. 蓝牙技术的发展与历程
  2. AutoForm使用
  3. 【论文总结】并发程序变异测试研究综述_田甜,巩敦卫
  4. internet信息服务管理器(IIS)安装和添加网站
  5. 关于《死亡细胞》美术工作流的初步探索
  6. 微型计算机原理实验心得,微机原理实验的心得体会.docx
  7. ardl模型stata命令_18种Eviews方程参数估计方法汇总​
  8. Python例题(一) 输入一个正整数判断是不是素数
  9. 【农业科研】精准提取黄土高原苹果园数据
  10. 素数的随机生成:Lagrange素数定理