2017-06-20 10 views
0

ich eine Spalte in einer Oracle-Datenbank haben, die so etwas wie diese DatenSplit Spalte in Oracle

column1 
/opt/log/data/abcd.efghi.jklmn.aaa.txt 
/opt/log/data/abbbcd.efccghi.jkdsdflmn.abab.txt 
/opt/log/data/nmvcnmcd.efjhjghi.jkvslmn.abcbc.txt 
/opt/log/data/hjsdhj.hjfdhdf.hdfhjd.aghag.txt 
/opt/log/data/dfhjfdhj.yureyer.qwtyq.hjahjh.txt 

Ich möchte die Daten so teilen, dass

**firstdot seconddot  thirdnfourthdot** 
abcd  efghi   jklmn.aaa 
abbbcd  efccghi  jkdsdflmn.abab 
nmvcnmcd efjhjghi  jkvslmn.abcbc 
hjsdhj  hjfdhdf  hdfhjd.aghag 
dfhjfdhj yureyer  qwtyq.hjahjh 

ich das bekommen kann Seconddot Wert von

select substr(column1,instr(column1,'.',1+1,instr(column1,'.',1,2)-instr(column1,'.',1,1)-1) as secondot 

aber ich konnte den Rest nicht bekommen. Kannst du mir helfen?

Vielen Dank

Antwort

1

Ohne regexp Sie die antworten müssen Die gleiche Logik für jede Teilkette, die Sie benötigen, jedes Timi, das die Anfangsposition und die Länge basierend auf der Position von th e "Terminator" dieser Teilkette.

/* input data */ 
    with yourTable(column1) as (
     select '/opt/log/data/abcd.efghi.jklmn.aaa.txt' from dual union all 
     select '/opt/log/data/abbbcd.efccghi.jkdsdflmn.abab.txt' from dual union all 
     select '/opt/log/data/nmvcnmcd.efjhjghi.jkvslmn.abcbc.txt' from dual union all 
     select '/opt/log/data/hjsdhj.hjfdhdf.hdfhjd.aghag.txt' from dual union all 
     select '/opt/log/data/dfhjfdhj.yureyer.qwtyq.hjahjh.txt' from dual 
    ) 
/* query */ 
    select substr(column1, instr(column1, '/', -1) +1, instr(column1, '.') - instr(column1, '/', -1)-1) firstDot, 
      substr(column1, instr(column1, '.') +1, instr(column1, '.', 1, 2) - instr(column1, '.') -1) secondDot, 
      substr(column1, instr(column1, '.', 1, 2) +1, instr(column1, '.', 1, 4) - instr(column1, '.', 1, 2) -1) thirdAndFourthDot 
    from yourTable 

gibt:

FIRSTDOT  SECONDDOT  THIRDANDFOURTHD 
--------------- --------------- --------------- 
abcd   efghi   jklmn.aaa 
abbbcd   efccghi   jkdsdflmn.abab 
nmvcnmcd  efjhjghi  jkvslmn.abcbc 
hjsdhj   hjfdhdf   hdfhjd.aghag 
dfhjfdhj  yureyer   qwtyq.hjahjh 

In einer lesbaren Weise:

select substr(column1, lastSlashPos +1, firstDotPos - lastSlashPos -1) as firstDot, 
     substr(column1, firstDotPos +1, secondDotPos - firstDotPos -1) as secondDot, 
     substr(column1, secondDotPos +1, fourthDotPos - secondDotPos -1) as thirdAndFourthDot 
from (
     select instr(column1, '/', -1) as lastSlashPos, 
       instr(column1, '.') as firstDotPos, 
       instr(column1, '.', 1, 2) as secondDotPos, 
       instr(column1, '.', 1, 3) as thirdDotPos, 
       instr(column1, '.', 1, 4) as fourthDotPos, 
       column1 
     from yourTable 
    ) 
+0

danke das funktioniert – user3845185

0
select substr('/opt/log/data/abcd.efghi.jklmn.aaa.txt',instr('/opt/log/data/abcd.efghi.jklmn.aaa.txt','/',-1) + 1) from dual; 

Dies wird Ihnen nach dem letzten /

Dann müssen Sie für . anwenden instr Text geben:

select 
    substr(text, 1, instr(text,'.', 1) - 1), 
    substr(text, instr(text,'.', 1) + 1, instr(text,'.', 2) - 1), 
    substr(text, instr(text,'.', 2) + 1) 
from (
    select substr('/opt/log/data/abcd.efghi.jklmn.aaa.txt',instr('/opt/log/data/abcd.efghi.jklmn.aaa.txt','/',-1) + 1) text from dual 
); 
+0

Ist es möglich, dies zu tun, ohne substr-Funktion in dem von-Anweisung? – user3845185

+0

Es ist aber das sah für mich klarer aus. – Kacper