1

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

表格示例:

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

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

4

1 回答 1

2

例如,这篇博文适用于您的问题: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(全部大写)即使两个名称都有两种变体 - 这是不一致,所以我只是忽略了它。

于 2013-08-28T06:07:58.727 回答