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

时间:2013-08-27 22:22:20

标签: regex oracle plsql oracle11g plsqldeveloper

关于这个主题的很多不同的帖子。 但我真的找不到适合我项目的那个。 我有一个包含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

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

1 个答案:

答案 0 :(得分:2)

E.g。此博文适用于您的问题:Splitting a comma delimited string the RegExp way, Part Two。我的答案直接来源于博客:

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
;

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