将多个分隔字符串拆分为唯一的行-基本上从表中返回句子中的唯一单词



关于这个主题有很多不同的帖子。但我真的找不到适合我项目的。我有一张表,有4列varchar2,长度分别为20、60、72和160。包含apx≈70万条记录以及项目/产品的数据。

表格示例:

Text                    Id  SHNAM
LEVI,GRADY Whitley      1   007C
Levi Grady;Whitley      2   0001
BEVIS,GRADY Leblanc     3   007D
Aladdin Grady;Green     4   0002
ULLA,GRADY Holman       5   0003

从这个表中,我想填充一个新的表或每个唯一单词的物化视图。使用的分隔符可以是空格、逗号或分号(',;')。

预期输出:

OUTPUT
Levi
GRADY
Whitley
BEVIS
Leblanc
Aladdin
Green
ULLA
Holman

请注意,该检查不区分大小写。

例如,这篇博客文章适用于您的问题:以RegExp方式拆分逗号分隔的字符串,第二部分。我的答案直接来自博客:

with data_(id_, str) as (
  select 1, 'LEVI,GRADY Whitley' from dual union all
  select 2, 'Levi Grady;Whitley' from dual union all
  select 3, 'BEVIS,GRADY Leblanc' from dual union all
  select 4, 'aladdin grady;green' from dual union all
  select 5, 'ULLA,GRADY Holman' from dual union all
  select 6, '1aar,1bar;1car 1dar,1ear' from dual
)
select distinct lower(regexp_substr(str, '[^,;[:space:]]+', 1, rownum_)) as splitted
  from data_
 cross join (select rownum as rownum_
               from (select max(regexp_count(str, '[,;[:space:]]')) + 1 as max_
                       from data_
                    )
            connect by level <= max_
            )
 where regexp_substr(str, '[^,;[:space:]]+', 1, rownum_) is not null
 order by splitted
;

请注意,这个查询的输出与您在问题中列出的ID从1到5的输出不完全相同。你期望Levi(带initcap)和GRADY(全大写),即使这两个名字都有变体-这是不一致的,所以我只是忽略了它。

最新更新