2010-08-31 13 views
3

J'ai un chemin de type arbitraire (mais numérique) de longueur arbitraire que j'ai besoin de canoniser à une profondeur fixe (2 ou 3). Au fond, je veux ce résultat:Regex pour transformer/01/02/007/... en 01/02 et/01 en 01/NA - est-ce possible?

/01/02/007/008 -> 01/02/007 
/01/02/007  -> 01/02/007 
/01/02   -> 01/02/NA 
/01    -> 01/NA/NA 

que je veux faire avec l'aide de la fonction regexp_replace() d'Oracle, qui apparently impelements la norme regexp POSIX. Ce que j'ai jusqu'ici est ceci: regexp_replace(path,'/([^/]+(/[^/]+)?).*','\1'); Mais j'ai des problèmes avec la partie NA.

Répondre

1

Cela semble fonctionner:

SQL> WITH q AS (
SELECT '/01/02/007/008/009' a FROM dual 
UNION 
SELECT '/01/02/007/008' FROM dual 
UNION 
SELECT '/01/02/007' FROM dual 
UNION 
SELECT '/01/02' FROM dual 
UNION 
SELECT '/01' FROM dual) 
SELECT a, CASE WHEN INSTR(a,'/',1,4) > 0 THEN SUBSTR(a,2,INSTR(a,'/',1,4)-2) 
       WHEN INSTR(a,'/',1,3) > 0 THEN SUBSTR(a,2) 
       WHEN INSTR(a,'/',1,2) > 0 THEN SUBSTR(a,2)||'/NA' 
       ELSE SUBSTR(a,2)||'/NA/NA' 
      END RESULT 
    FROM q;   

A     RESULT 
--------------  ------------------- 
/01    01/NA/NA 
/01/02    01/02/NA 
/01/02/007   01/02/007 
/01/02/007/008  01/02/007 
/01/02/007/008/009 01/02/007 

SQL> 

Bien sûr, si cela est tout simplement un exercice dans les expressions régulières, il ne répond pas à vos besoins.

0

Vous n'avez pas vraiment besoin d'une regex ici, utilisez simplement substr avec instr, par exemple.

SUBSTR(path, 0, instr(path, '/', 1, 4)-1) 

Vous devrez attraper le cas où il n'y a pas une quatrième barre oblique dans la chaîne.