问题是这样的,我得到一个字符串,3c,有两个栏位里有如下信息3a,3b,3c,11,12,13,4a,4b,4c,另一个栏位里是1,2,3,4,5,6,7,8,9
也就是说通过字符串3c找到栏位一里3c对应的,号在第几个位置上,然后在第二个栏位里取该位置,号前的字符串,我想了一下用instr取到的位置不准,不知道应该怎么弄,大侠指点一下!!
也就是说通过字符串3c找到栏位一里3c对应的,号在第几个位置上,然后在第二个栏位里取该位置,号前的字符串,我想了一下用instr取到的位置不准,不知道应该怎么弄,大侠指点一下!!
with tt as(select '3a,2bad,ada,4ad,232a,' col1,'2,3,4,1,5' col2 from dual)select substr(col2,1,instr(col2,',',1,length(substr(col1,1,instr(col1,'ada')))
-length(replace(substr(col1,1,instr(col1,'ada')),','))+1)-1)
from tt
select 'aa', substr('1,2,3', trunc(instr('aa,bb,cc', 'aa')/3) * 2 + 1, 1), 'aa,bb,cc'
from dual;
看看高手们有没有更加好的办法,第一个字串逗号直接是两个字符,第二个字串逗号之间是一个字符,
就是如上所示的,aa要求转换成1,先找到'aa,bb,cc'中'aa'逗号的位置,再找'1,2,3'中这个顺序的逗号对应的值.
测试是可以的,aa变成1,bb变成2,cc变成3
有点麻烦,期待高手有更加好的办法解决!!
TKS!!
2 select ceil(to_number(instr(('3a,3b,3c,11,12,13,4a,4b,4c'),'3c',1,1))/3) a from dual
3 );B
-
3
trunc可以去掉,把里面instr的值减一即可
substr('1,2,3,4,5,6,7,8,9',2*a-1,1);
instr(col2,',',1,instr(col1,'4ad')-length(replace(substr(col1,1,instr(col1,'4ad')),','))+1)-
instr(col2,',',1,instr(col1,'4ad')-length(replace(substr(col1,1,instr(col1,'4ad')),',')))-1)
from tt这个可以实现。我再想办法简化
什么版本的数据库?
可以用以下的操作:select distinct a,trunc((b/3)+1) b from
(
select substr(a,mod(rownum,3)*rownum,2) a,
mod(rownum,3)*rownum b from
(
select '3a,3b,3c,11,12,13,4a,4b,4c' a from dual
)
connect by rownum<length(a)
) where b<>0 and a is not null
--and a='3c'
order by b--result:3a 1
3b 2
3c 3
11 4
12 5
13 6
4a 7
4b 8
4c 9
from tt在要查询的值两端加上','比较保险
(
select a,b,
nvl(lead(b) over(partition by a order by b),0) c,
lag(b) over(partition by a order by b) d
from
(
select distinct a, instr(a,',',rownum) b
from
(
select '3a,3b3,3c,11,12,11111113,4a111,114b,4c' a from dual
)
connect by rownum<length(a)
)
)
--result:3a 1
3b3 2
3c 3
11 4
12 5
11111113 6
4a111 7
114b 8
4c 9