我收到了这个查询,想要在括号之间提取值。
select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1)
from DATABASE
where col_name like '[%]';
然而它给了我带括号的值,例如“[TEST]”。我只想要“TEST”。如何修改查询以获取它?
答案 0 :(得分:85)
REGEXP_SUBSTR函数的第三个参数指示要开始搜索的目标字符串(示例中为de_desc
)中的位置。假设在字符串的给定部分中找到匹配,则不会影响返回的内容。
在Oracle 11g中,该函数有第六个参数,我认为是您尝试使用的参数,它表示您想要返回的捕获组。正确使用的一个例子是:
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual;
最后一个参数1
表示您想要返回的捕获组的编号。以下是描述参数的文档的link。
10g似乎没有此选项,但在您的情况下,您可以通过以下方式获得相同的结果:
select substr( match, 2, length(match)-2 ) from (
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual
);
因为您知道匹配在开头和结尾只有一个多余的字符。 (或者,您可以使用RTRIM和LTRIM从结果的两端删除括号。)
答案 1 :(得分:20)
您需要进行替换并使用与整个字符串匹配的正则表达式模式。
select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE;