[英]How to select the list of words containing a particular substring as part of a SQL query (oracle)?
我正在尝试返回包含字符串中某个子字符串的“单词”列表(以空格分隔),作为 Oracle Sql 查询的一部分。 想以逗号分隔的列表形式返回结果。 每个匹配的单独行也可以工作。
[text_col] 字段中的示例字符串:
一些单词 123-asdf-789A 以及这个 456-asdf-555A 更多单词等。
123-asdf-789A, 456-asdf-555A
结果: 123-asdf-789A, 456-asdf-555A
到目前为止,这是我所拥有的,但它只返回第一个结果,而且它是两个单独的正则表达式,因此很难像我想做的那样连接所有匹配项。
CONCAT(REGEXP_SUBSTR(text_col, ''(([^[:space:]]+)\asdf)'', 1, 1, ''i'', 1),
REGEXP_SUBSTR(text_col, ''\asdf([^[:space:]]+)'', 1, 1, ''i'', 1))
您可以将一些正则表达式函数一起使用:
with tab(str) as
(
select 'some words 123-asdf-789A and also this one 456-asdf-555A more words etc' from dual
), t as
(
select regexp_substr(str,'[^[:space:]]+',1,level) as str, level as lvl
from tab
connect by level <= regexp_count(str,'[:space:]')
)
select listagg(str,',') within group (order by lvl) as "Result"
from t
where regexp_like(str,'-');
Result
---------------------------------
123-asdf-789A,456-asdf-555A
首先按空格分割(通过[:space:]
posix)并取包含破折号的那些,最后通过listagg()
函数连接
使用递归子查询分解子句,并在执行过程中遍历连接字符串的所有匹配项:
甲骨文设置:
CREATE TABLE test_data ( value ) AS
SELECT 'some words 123-asdf-789A and also this one 456-asdf-555A more words etc.' FROM DUAL UNION ALL
SELECT 'some words without the expected sub-string' FROM DUAL UNION ALL
SELECT 'asdf asdf-123 456-asdf 78-asdf-90' FROM DUAL
查询:
WITH matches ( value, idx, cnt, match ) AS (
SELECT value,
0,
REGEXP_COUNT( value, '\S*asdf\S*' ),
CAST( NULL AS VARCHAR2(4000) )
FROM test_data
UNION ALL
SELECT value,
idx + 1,
cnt,
CASE idx WHEN 0 THEN '' ELSE match || ' ' END
|| REGEXP_SUBSTR( value, '\S*asdf\S*', 1, idx + 1 )
FROM matches
WHERE idx < cnt
)
SELECT value, match
FROM matches
WHERE idx = cnt;
输出:
\n价值 | 比赛 \n :------------------------------------------------- --------------- | :--------------------------------\n一些没有预期子串的词 | 空值 \n一些词 123-asdf-789A 以及这个 456-asdf-555A 更多词等 | 123-asdf-789A 456-asdf-555A \n asdf asdf-123 456-asdf 78-asdf-90 | asdf asdf-123 456-asdf 78-asdf-90\n
db<> 在这里摆弄
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.