2011-10-13 18 views

Odpowiedz

67

Trzeci parametr funkcji REGEXP_SUBSTR wskazuje pozycję w ciągu docelowym (de_desc w twoim przykładzie), w którym chcesz rozpocząć wyszukiwanie. Zakładając, że znaleziono dopasowanie w danej części łańcucha, nie ma to wpływu na to, co jest zwracane.

W Oracle 11g istnieje szósty parametr funkcji, który, jak sądzę, jest tym, co próbujesz użyć, który wskazuje grupę przechwytywania, która ma zostać zwrócona. Przykładem prawidłowego użytkowania byłoby:

SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual; 

Jeżeli ostatni parametr 1 podać numer grupy przechwytującej chcesz zwrócone.

10g nie wydaje się mieć tę opcję, ale w twoim przypadku można osiągnąć ten sam rezultat z:

select substr(match, 2, length(match)-2) from (
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual 
); 

ponieważ wiesz, że mecz będzie miał dokładnie jeden nadmiar znaków na początku i na końcu. (Alternatywnie, możesz użyć RTRIM i LTRIM, aby usunąć nawiasy z obu końcówek wyniku.)

+0

Co zadziwiające jest to, że 6-cie parametr nie jest wymienione w oficjalnej dokumentacji REGEXP_SUBSTR Oracle. Dzięki za wskazanie, że istnieje. –

14

Musisz zastąpić i użyć wzorca regex pasującego do całego ciągu znaków.

select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE; 
+0

IMHO to najprostszy, łatwy do zapamiętania, bardziej elastyczny i dlatego najlepszy sposób na zrobienie tego. –

+7

Ostrzegam każdego, kto używa 'REGEXP_REPLACE', aby uzyskać grupę przechwytywania, że ​​jeśli wzór nie zostanie dopasowany, Oracle zwróci całą wartość, podczas gdy zachowanie, które prawdopodobnie chcesz, to zwrócenie' null'. Na przykład 'REGEXP_REPLACE ('abcdefghi', '. * \ [(. +) \]. *', '\ 1')' (wzór nie jest dopasowany) zwraca 'abcdefghi'. To potknęło mnie raz. – Jared

+0

Problem polega na tym, że wyrażenie regexp Oracle nie zapewnia funkcji zwracania części ciągu pasującego do grupy przechwytującej. Możesz spróbować użyć zapytania rekursywnego (wybierz ... z zakładki connect by ...), ale bądź świadomy potencjalnego problemu z wydajnością. – Cyryl1972

Powiązane problemy