大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
有时候查询的时候会进行拆分,对某串字符串进行拆分的时候可以用:
创新互联-专业网站定制、快速模板网站建设、高性价比博罗网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式博罗网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖博罗地区。费用合理售后完善,十载实体公司更值得信赖。
select regexp_substr('aaaaa,bbbb,cc,ddddd,ee','[^,]+',1,level)
from dual
connect by level = regexp_count('aaaaa,bbbb,cc,ddddd,ee',',')+1;
对于表中的每一行进行拆分,则需自身与自身递归,但是connect by deptno = prior deptno 会报错误,因此需要使用prior dbms_random.value is not null 来欺骗oracle
例: select t.*,regexp_substr(t.ename,'[^,]+',1,level)
from emp_bak t
connect by level = regexp_count(t.ename,',')+1
and t.ename = prior t.ename
and prior dbms_random.value is not null;
例如表名为test,数据如下
原数据为
col1 col2 col3 col4
A 1 2 3
B 1 2 3
然后用如下语句
select * from
(select col1,col2 from test
union all
select col1,col3 from test
union all
select col1,col4 from test) as t
order by col1
得到的数据就是
A 1
A 2
A 3
B 1
B 2
B 3
本文个人拙见,若有出入,请指出——来自菜的颤抖
该方式的效率不高,如何优化,请看 记Oracle中regexp_substr函数的一次调优(速度提高99.5%)
表A中存放了集装箱的信息,一个集装箱一条记录,表B中存放了对于集装箱操作的指令,一条指令包括多个集装箱箱号,通过分号 ; 切割( TCIU2347687;XUTR3546865 ),现在的需求是,对于已经在指令表B中的集装箱,在查询表A时需要过滤掉。
所以必须将分号分割的记录,拆分成单独的记录。
变成:
Oracle可使用 regexp_substr函数 实现,实现上面切割的sql为:
其中 regexp_substr 各个参数的含义:
结果就是 aaa , 如果把第二个1变成2,输出就是 bbb 。
好了,这部分意图很明显了,下面就是把它每一个切割串取出来,看到上面取 level个 ,而这个 level 是个什么东西呢,在这个之前,先看 regexp_count(string, c) 函数,这个函数其实很好理解,返回string中c的个数。
然后就是这个level,这是一个伪列,和RowNum相似,
所以再回到最初的sql,也就很好理解了。
通过instr和truncate函数进行拆分。
instr得到各个顺序的@的位置,truncate通过得到的位置情况进行字符串截取。