假设我有此表MESSAGE
,其中有两列ITEM
和CONTENT
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;
答案 0 :(得分:2)
您可以使用(\$\{.+?\})
-使用?
会使{}
之间的一个或多个字符成为非贪婪匹配
()
捕获了该组。
使用connect by
的{{1}}循环(带有PRIOR
和SYS_GUID()
)来提取一行中所有可能的匹配项。
level
进行串联。
LISTAGG
答案 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, 1
和1, 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}