Oracle SQL:提取两个字符之间的文本

5

我有一些看起来像这样的字符串

{ABCDE}{F1}
{GHIJ}{K12}

我想提取第一个花括号内的文本。
ABCDE
GHIJ

我尝试在网上搜索,但很多答案似乎都使用了函数或PL-SQL。有人可以帮我解决这个问题吗?


1
了解正则表达式。 - OldProgrammer
3个回答

13

我们可以在这里使用REGEXP_SUBSTR

SELECT regexp_substr('{ABCDE}{F1}', '\{([^}]+)\}', 1,1,NULL,1) AS output
FROM dual

演示

这是一个较少见的 REGEXP_SUBSTR 的用法,它使用了捕获组,按照以下模式进行匹配:

\{([^}]+)\}
第六个参数指定返回第一个捕获组。

我认为正则表达式中的最后一个\}是不必要的。 - David Faber
1
@DavidFaber 是的,因为该列中可能存在没有闭合括号的值,这种情况下我们可能不想捕获它们。这取决于我们对 OP 数据的假设。我倾向于保险起见。 - Tim Biegeleisen
很好的答案,但是你是指第六个参数而不是第四个吗?我使用了你的代码,并且让示例中的第二个字符串正常工作了:regexp_substr(raw_text, '{([^}]+)}', 1,2,NULL,1)。 - Christian Palmer
@ChristianPalmer 也许重新加载页面以查看原帖的实际数据。你在查询中将第四个参数从1更改为2,只是表示要获取第二个匹配项,而不是第一个。如果我理解正确,这不是原帖作者想要的。 - Tim Biegeleisen
@TimBiegeleisen - 你是正确的 - 我只是跟不上世界的步伐太慢了 :) - Christian Palmer

6

这有点老派了。我喜欢正则表达式,可以理解它们,但是当我尝试编写它们时会遇到很多麻烦,就像对我来说的西班牙语一样。所以这只涉及SQL中的INSTR / SUBSTR / REPLACE。我不指望任何赞...

WITH test_data (raw_text)
 AS 
  (SELECT '{ABCDE}{F1}' from dual UNION ALL
   SELECT '{GHIJ}{K12}' from dual 
  )
SELECT
 raw_text
,SUBSTR(raw_text,2,INSTR(raw_text,'}{')-2)              first_string
,REPLACE(SUBSTR(raw_text,INSTR(raw_text,'}{')+2),'}')   second_string
--these two from Tim's excellent answer
,regexp_substr(raw_text, '\{([^}]+)\}', 1,1,NULL,1) 
,regexp_substr(raw_text, '\{([^}]+)\}', 1,2,NULL,1)
FROM
 test_data
;

Demo


1
实际上,对于像这样的简单操作,使用基本字符串函数通常比正则表达式更高效。但是,它的缺点是代码可能更难阅读和维护。+1。 - Tim Biegeleisen

1
你可以尝试类似以下的代码:

SELECT TRIM( '{' FROM REGEXP_SUBSTR(mystring, '\{[^}]+') )
  FROM mytable;

这将捕获从第一个左大括号到但不包括右大括号的文本,然后从结果中删除左大括号。希望这可以帮助您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接