Oracle SQL:提取每一行中所有匹配的字符串

时间:2018-07-24 05:01:24

标签: regex oracle oracle12c

假设我有此表MESSAGE,其中有两列ITEMCONTENT

ITEM1 | Dear ${username}, you have changed your address to ${address}
ITEM2 | Hi ${username}, thank you for attending this event.

目前,我想显示每个带有$ {variable}模式的单词。预期的最终结果是

ITEM1 | ${username}, ${address}
ITEM2 | ${username}

要实现此目标,正确的Oracle SQL查询是什么?我已经尝试过类似的操作,但是它只是列出了匹配正则表达式的内容。

SELECT ITEM, REGEXP_SUBSTR(CONTENT, '^.*\$\{.*\}.*$', 1, 1) FROM MESSAGE;

3 个答案:

答案 0 :(得分:2)

您可以使用(\$\{.+?\})-使用?会使{}之间的一个或多个字符成为非贪婪匹配
()捕获了该组。

使用connect by的{​​{1}}循环(带有PRIORSYS_GUID())来提取一行中所有可能的匹配项。

level进行串联。

LISTAGG

Demo

答案 1 :(得分:0)

我不太擅长使用正则表达式,请看这是否有帮助:

SQL> with message (item, content) as
  2    (select 'ITEM1', 'Dear ${username}, you have changed your address to ${address}' from dual union
  3     select 'ITEM2', 'Hi ${username}, thank you for attending this event.' from dual
  4    )
  5  select item,
  6    regexp_substr(content, '\$\{\w+}', 1, 1) the_first,
  7    regexp_substr(content, '\$\{\w+}', 1, 2) the_second
  8  from message;

ITEM  THE_FIRST            THE_SECOND
----- -------------------- --------------------
ITEM1 ${username}          ${address}
ITEM2 ${username}

SQL>

它是做什么的?

  • \$在这里用于转义美元符号,因为它被用作字符串末尾的 anchor (因此,请转义)
  • \{的用法也一样,因为大括号代表出现的次数(因此-对其进行转义)
  • \w+占据了整个单词
  • 1, 11, 2:从第一个字符开始,取第一个(1, 1 )或第二个字符(1, 2 )该表达式的外观

将这两个连接起来并用逗号分隔是很简单的。

答案 2 :(得分:0)

with
  inputs ( str ) as (
    select 'Dear ${username}, you have changed your address to ${address}' 
    from   dual
  )
select rtrim(regexp_replace(str, '.*?(\${[^}]*}|$)', '\1, '), ', ') as vars 
from   inputs;

VARS                   
-----------------------
${username}, ${address}