Ответ 1
Третий параметр функции REGEXP_SUBSTR указывает позицию в целевой строке (de_desc
в вашем примере), где вы хотите начать поиск. Предполагая, что совпадение найдено в заданной части строки, это не влияет на то, что возвращается.
В Oracle 11g есть шестой параметр функции, который, я думаю, и есть то, что вы пытаетесь использовать, который указывает группу захвата, которую вы хотите вернуть. Пример правильного использования будет:
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual;
Где последний параметр 1
указывает номер группы захвата, которую вы хотите вернуть. Вот ссылка на документацию, которая описывает параметр.
10g, кажется, не имеет этой опции, но в вашем случае вы можете достичь того же результата с:
select substr( match, 2, length(match)-2 ) from (
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual
);
так как вы знаете, что у совпадения будет ровно один лишний символ в начале и конце. (В качестве альтернативы вы можете использовать RTRIM и LTRIM для удаления скобок с обоих концов результата.)