Oracle拆分split字符串,instr函数的使用

需求:

学生表中的课程字段是存课程表的id:1,2,3

学生表: student

………………
id    name     Course
1     张三      1,2,3

………………

课程表: course

………………
     id    name
     1       语文
     2       数字
     3       英语
………………

查询学生表时,需要将对应的课程名称关联查出,如:

………………

张三    语文,数字,英语

………………

 

实现方案-1:

先将学生表课程的值按逗号拆分;再利用oracle合并列的函数wm_concat合并。

 

利用正则表达式实现拆分的示例:

--利用正则表达式实现拆分的示例
SELECT REGEXP_SUBSTR ('abc1,cbd2,db3,db5', '[^,]+', 1,rownum) FROM DUAL
CONNECT BY ROWNUM <= LENGTH ('abc1,cbd2,db3,db5') - LENGTH (REPLACE ('abc1,cbd2,db3,db5', ',', ''))+1;

 实现:

select s.name
	,(
		select wm_concat(c.name) 
		  from course c
		 where c.id in 
			(
			 SELECT REGEXP_SUBSTR (s.course, '[^,]+', 1,rownum) as id FROM DUAL
			 CONNECT BY ROWNUM <= LENGTH (s.course) - LENGTH (REPLACE (s.course, ',', ''))+1
			)
	) as course
from student s
where s.name = '张三';

 

实现方案-2:

利用instr函数;再利用oracle合并列的函数wm_concat合并。

select s.name
	,(
		select wm_concat(c.name) 
		  from course c 
		 where instr(s.course, c.id) > 0
	) as course
FROM student s where name ='张三';

 ***此方法的弊端:当course.id存在数值较小的情况时就会有误.

    eg: student.course='12345,67890'  course.id=1

        这时就会错误的把course.id=1的记录查出来。

 

 

instr函数,判断源字符串'是否包含 '目标字符串':

instr(sourceString,destString,start,appearPosition)

instr('源字符串' , '目标字符串' ,'开始位置','第几次出现')

 

start代表查找的开始位置,这个参数可选的,默认为1,如果start的值为负数,则代表从右往左进行查找,但是位置数据仍然从左向右计算;

appearPosition代表想从源字符中查找出第几次出现的destString,这个参数也是可选的, 默认为1

返回值为:查找到的字符串的位置。

--instr函数可以代替like使用,在大数据量的搜索时,instr效率明显高于like
instr('oracle’,'ac’)>0 相当于 like '%ac%'
instr('oracle’,'ac’)=0 相当于 not like '%ac%'

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值