用Oracle中的like语句替换

胡安·佩雷斯(Juan Perez)

我有一个synonyms table称为syns来存储单词和现有同义词。以同样的方式,还有另一个表叫做subs,其中包含word substitutions一个单词。这些表用于在称为主表的institutions主机中查找相似的值,该主表托管数据库中的现有名称。

这样做的目的是避免考虑同义词和单词替换的相似名称。用户提供了一个新的机构名称,在插入机构表之前,有多个查询用同义词和单词替换来替换每个单词。例如,我有以下数据:

substitution word table:
WORD      SUBS_LIST
MOUNTAIN  MOUNTAIN, MOUNT, MT, MTN
VIEW      VIEW, VU
FORMULA   FORMULA, 4MULA
Synonym list table:
WORD    SYN_LIST
EDUCATION   SCHOOL, UNIVERSITY, COLLEGE, TRAINING
institutions table:
NAME
FORMULA VIEW UNIVERSITY
FOURMULAE VULCAN COLLEGE
4MULA VU CAFE

机构表包含数据库中所有现有的名称。然后,当接收到新名称时,用每个单词的相应同义词列表和单词替换来替换单词时,不必一定要相似。例如,FORMULA VU SCHOOL由于现有record 应该在数据库中找到一个新名称,例如FORMULA VIEW UNIVERSITY

我创建了这个小提琴来展示这个想法。但是,我没有得到任何结果。

谢谢

思考长臂猿

下面的功能似乎正在工作。它使用将逗号分隔的字符串之一拆分为单词的技术,也可以应用其他字符串。但是最好的办法是将数据模型更改为单个单词同义词,这样可以避免拆分,这可能是不可靠的。您可以在检查新条目时使用此功能,例如:

where replace_synonyms(inserted_value) <> replace_synonyms(existing_value)

dbfiddle

测试:

select replace_synonyms('FORMULA VIEW UNIVERSITY') from dual;  
-- FORMULA VIEW EDUCATION
select replace_synonyms('CANTINA TRAINING MT')     from dual;  
-- FOOD EDUCATION MOUNTAIN

功能:

create or replace function replace_synonyms(i_text in varchar2) return varchar2
is
    p_text varchar2(4000) := i_text;

    cursor c_subs is
    select word, trim(column_value) text 
      from subs, xmltable(('"' ||replace(subs_list, ',', '","') || '"'))
      where p_text like '%'||trim(column_value)||'%'
    union 
    select word, trim(column_value) text 
      from syns, xmltable(('"' ||replace(syn_list, ',', '","') || '"'))
      where p_text like '%'||trim(column_value)||'%';

begin
   for i in c_subs
    loop
      p_text := regexp_replace(
          p_text, '(^|[^a-z0-9])' || i.text || '($|[^a-z0-9])', 
          '\1' || i.word || '\2', 1, 0,  'i');
    end loop;

   return p_text;
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章