TRIM nach CONNECT_BY_PATH

ratloser99

Grünschnabel
Hallo zusammen,

ich habe eine Tabelle in einer ORACLE-DB (10g) mit Benutzern, die in verschiedenen hierarchisch geordneten Gruppen organisiert sind. Deren Daten (Vor-, Nachname, GRuppe, ...) habe ich mir in eine Tabelle ausgeben lassen. Nun möchte ich denen die Gruppenebene duch ein CONNECT_BY_PATH zuordnen:
Code:
select
  SYS_CONNECT_BY_PATH (w.name,'.')
from
  repository.workgroup w
start with 
  w.parentwrkgroup_key is NULL
connect by 
  prior w.pkey = w.parentwrkgroup_key
order by 1;
Das Statement funktioniert soweit; ich bekomme die Ebenen durch einen Punkt getrennt ausgegeben (Ebene1.Ebene2.Eben3....) und habe sie in einer temporären Tabelle abgelegt. Nun muss ich jedoch davon die unterste Ebene wieder heraus finden, um die Zuordnung der Hierarchie zum Benutzer zu bekommen, das heißt z.B., befindet sich der Benutzer in der dritten Ebene, muss ich das 'Ebene1.Ebene2.Eben3....' wieder zu 'Ebene3' beschneiden
Mein bisheriger Ansatz sah so aus:

Code:
Select 
  substr(parent_groups,INSTR(parent_groups,'.')+1)
from 
  tmp_group

Damit kann ich jedoch nur eine (die oberste) Ebene abschneiden. Ich weiß jedoch nicht, wie tief die Ebenen geschachtelt sind. Wie kann ich also erreichen, dass mir nur der äußerst rechte String (nach dem letzten '.' ) ausgegeben wird? Eine andere Möglichkeit als das Aneinanderreihen über CONNECT_BY_PATH habe ich leider nicht.


Hat jemand eine Idee?
 
Zuletzt bearbeitet:
Moin ratloser99,

schau dir mal die skalare Oracle-Funktion REVERSE() an.

Die dreht einen String um... aus "anna" wird also z.B. "anna" etc.

Reverse( "Ebene1.Ebene2.Ebene3") wird entsprechend zu "3enebE.2enebE.1enebE".

Ein
SQL:
Select 
Reverse(
       Substr(Reverse(parent_groups),1, INSTR(Reverse(parent_groups),'.')-1) ) 
from 
  tmp_group
[ungetestet und sinngemäß- zähl nochmal selbst die Klammern nach...]
..sollte also die "Ebene3" (ohne "." zurückgeben.

Grüße
Biber
 
Zuletzt bearbeitet:
Hallo Biber,
vielen Dank für den Tipp. Ich habe jetzt ein bisschen rumprobiert und glaube auch, dass das ein Weg sein könnte. Der String ist jetzt jedenfalls umgekehrt. :-)
Nur: wie trimme ich den String so, dass er nur bis zum nächsten '.' reicht? Viel mehr als relativ einfache SELECTS habe ich bisher nicht gemacht...:-(

Bitte gib/gebt mir nochmal Tipps!

Danke schonmal!
 
Hallo Biber,
vielen Dank für den Tipp. Ich habe jetzt ein bisschen rumprobiert und glaube auch, dass das ein Weg sein könnte. Der String ist jetzt jedenfalls umgekehrt. :-)
Nur: wie trimme ich den String so, dass er nur bis zum nächsten '.' reicht? Viel mehr als relativ einfache SELECTS habe ich bisher nicht gemacht...:-(

Bitte gib/gebt mir nochmal Tipps!

Danke schonmal!

Hi,

Bin mir nicht ganz sicher für was das ganze ist, aber hast du schon mal probiert, im CONNECT BY das Keyword LEVEL zu benutzen :


Code:
select
  SYS_CONNECT_BY_PATH (w.name,'.'), LEVEL
from
  repository.workgroup w
start with 
  w.parentwrkgroup_key is NULL
connect by 
  prior w.pkey = w.parentwrkgroup_key
order by 1;



Evtl. Hilft dir dies weiter ?

Gruss
 

Neue Beiträge

Zurück