需求:原始表的类型标签字段数据采用父子标签-拼接,多个标签,拼接。
如:tag1-subTag1,tag2,subTag5。
我们的目标标签字段应该为:tag1,tag2,其他类型。
数据库中有标签类型数据表tag_info,主要结构如下:

id tag parentId lev

创建函数如下:
首先创建根据,拆分成数组的函数

create type tab_varchar is table of varchar2(255);
/**功能:字符串分隔管道函数p_str    源字符串p_sep 分隔符,默认为逗号
*/
create or replace function get_split_str(p_str varchar2, p_sep varchar2 default ',')return tab_varchar pipelinedisl_idx int:=0;v_list varchar2(4000) := p_str;
beginloopl_idx := instr(v_list,p_sep);--没找到分隔符if l_idx = 0 thenpipe row(v_list);return;--分隔符是第一个字符elsif l_idx = 1 thenv_list := substr(v_list,l_idx+length(p_sep));--分隔符是最后一个字符elsif l_idx = length(v_list) thenpipe row(substr(v_list,1,l_idx-1));return;else--打印第一个逗号之前的字符,然后继续执行pipe row(substr(v_list,1,l_idx-1));v_list := substr(v_list,l_idx+length(p_sep));end if;end loop;
end;

建立后创建下面的清洗函数

/**洗涤标签函数;negative 未经洗涤的标签字符串步骤:1.先过剔除所有-后面的2.匹配tag_info确定是否是一级标签如一级标签则保留否则替换成其他类型*/
create function ysl_tag_wash(negative varchar2)return varchar2 is res varchar2(4000);
cou number := 0;
var varchar2(4000) := '';
begin--将参数按,分割;并遍历分割后的数组for e in (select column_value from table(get_split_str(negative))) loop--去除-后面的子级标签内容var :=  case when instr(e.column_value,'-')=0 then e.column_value else substr(e.column_value,0,instr(e.column_value,'-')-1) end;--判断该值是否在标签表中存在一级标签与之对应select count(1) into cou from tag_info where tag = var and is_deleted = 0 and lev = 1 ;--存在一级标签if cou = 1thenselect tag into var from tag_info where tag = var and is_deleted = 0 and lev = 1 group by name;else--不存在则视为其他类型var:='其他类型';end if;--重置cou变量cou := 0;if res is nullthen--首次拼接无需,res:=res||var;else--不存在其他类型或当前标签不为其他类型则拼接if instr(res,var)=0thenres:=res||','||var;end if;end if;end loop;return res;
end;

oracle函数将多级标签逗号拼接的单个字段洗涤成仅含一级标签的字段相关推荐

  1. oracle转换成字符型,Oracle中将Clob字段转换成字符串

    1. 利用dbms_lob.substr()方法可将对应字段转换成字符串如下 select dbms_lob.substr(content) from NEWS 该方法有个缺点,当content字段长 ...

  2. oracle实现将字段按逗号拼接/按逗号分为多行

    oracle实现将字段按逗号拼接/按逗号分行 一.拼接 1.普通拼接 2.进阶:限制拼接个数并去重 3.进阶:拼接除去当前值的其他值 4.函数说明 LISTAGG 二.分行 1.普通分行方法1 2.进 ...

  3. java查询出来的日期类型_Java的第29天,Oracle函数

    今天是学习Java的 第29天. 今天学习了数据库中DQL语言中的逻辑条件关系,优先规则,使用order by 排序.学习了Oracle函数,包括单行函数和多行函数,学习了字符函数,字符处理函数,数字 ...

  4. 三、Oracle 函数

    一.Oracle 操作集 二.Oracle 数据类型 三.Oracle 函数 四.Oracle 视图 五.Oracle 序列 六.Oracle 同义词 七.Oracle 索引 八.Oracle PL/ ...

  5. Oracle--SQL技巧之二(多行记录用逗号拼接在一起)

    需求: 目前接触BI系统,由于业务系统的交易记录有很多,常常有些主管需要看到所有的记录情况,但是又不想滚动,想一眼就可以看到所有的,于是就想到了字符串拼接的形式. 解决方案:使用Oracle自带的函数 ...

  6. mysql中逗号前的字符串_MySql逗号拼接字符串查询的两种方法

    下面两个函数的使用和FIND_IN_SET一样,使用时只需要把FIND_IN_SET换成FIND_PART_IN_SET或FIND_ALL_PART_IN_SET 例如某字段里是为1,2,3,4,5 ...

  7. oracle函数-动态结果输出

    1.oracle函数创建 create or replace function fun_test()begin end fun_test; 2.函数调用 select * from table(fun ...

  8. oracle tochar 格式 ¥,ORACLE函数TO_CHAR以及数字转换格式

    ORACLE函数TO_CHAR以及数字转换格式 数点,则要和D配合使用,不能和点号配合. 11 L(本地货币符号) 'L999' 是C的本地版本.可以放在整个格式的最前面和最后面. TO_CHAR(1 ...

  9. mybatis可以用oracle,使用MyBatis调用oracle函数(基于注释)

    我需要使用注解在MyBatis中调用Oracle函数.使用MyBatis调用oracle函数(基于注释) 我的映射: @Select("{ CALL #{outParam, jdbcType ...

最新文章

  1. 学习的本质在于触发了你的思考
  2. AngularJS与Django-模板标签冲突
  3. 西湖首届本科生开招!每名学生配三位学术导师,大二全员海外交流
  4. 一个项目涉及到的50个Sql语句(整理版)
  5. 嵌入式系统需求分析_嵌入式开发流程是什么?
  6. sklearn快速入门教程:(二)线性回归
  7. vijos p1143(三取方格数)(100)
  8. 向有环的环形链表中插入新节点
  9. SAP更新数据表的程序执行需要SE38后执行
  10. Java 动态代理实践AOP
  11. cmd窗口快速定位到具体文件夹方法
  12. 3皮卡丘眨眼代码_活见久,皮卡丘居然是一门编程语言
  13. [html] 如何禁止web端的页面缩放?
  14. 【计算机网络】—— 停止-等待协议
  15. solr导入mysql失败_mysql – SOLR DataImport错误“无法执行查询”
  16. ThinkPHP+jQuery EasyUI Datagrid查询数据的简单处理
  17. web 折线图大数据量拉取展示方案_对比多种微前端方案
  18. html5注册阿里巴巴作业,面试分享:2018阿里巴巴前端面试总结(题目+答案)
  19. bjui—关闭dialog以及当前标签
  20. Metasploit——渗透攻击模块(Exploit)

热门文章

  1. 不一样的Python代码写法!通过这7招,让你写出一手漂亮的代码
  2. java画蝴蝶_java之数组
  3. 如何为代码起好的名字
  4. 虚拟机安装Ubuntu操作系统(详细安装教程)以及快照创建使用
  5. mac运行windows应用:Parallels Desktop Mac版本
  6. 什么是软负载和硬负载?
  7. 什么是负载均衡/故障转移
  8. 2022.10.27 英语背诵
  9. HTML-CSS笔记_0424
  10. python图片转手绘软件_【python小工具】不给你的女朋友来张素描吗?使用python将图片转素描...