繁体   English   中英

如何选择包含特定子字符串的单词列表作为 SQL 查询 (oracle) 的一部分?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM