比较Oracle SQL中的两个非结构化数据列

时间:2013-11-18 14:52:07

标签: sql oracle

我的数据库表有两个最大2000的varchar字段。

评论1 评论2

这两个字段都包含大量包含非结构化数据的字段。

情况是Comment2字段中可能存在所有Comment1数据。

我正在寻找一个SQL查询或函数来帮助我比较这两个非结构化数据字段,例如我可以找到匹配,其中Comment1的部分或全部数据位于Comment2

例如: 假设Comment1包含数据:

您好,我的名字是xyz。我在abc公司工作。我是一名经理。

Comment2字段包含:

您好,我的名字是xyz。我在abc公司工作。我是一名经理。我的责任是保持记录。我经理了两位前辈。

在这里,我们看到Comment1的全部或部分数据位于Comment2中。因此,我应该在比较中找到匹配。

由于

1 个答案:

答案 0 :(得分:2)

如果你想对comment1中包含的每个句子进行不区分大小写的搜索,并测试它是否也在comment2内(假设你有一个唯一标识该行的字段):

WITH sentences AS (
  SELECT ID,
         LEVEL AS sentence_position,
         UPPER(TRIM(REGEXP_SUBSTR( comment1, '[^.]+(\.|$)', 1, LEVEL ))) AS sentence
  FROM comments
  CONNECT BY LEVEL <= REGEXP_COUNT( comment1, '[^.]+(\.|$)' )
)
SELECT *
FROM   comments c
WHERE  EXISTS ( SELECT 1
                FROM   sentences s
                WHERE  s.id = c.id
                AND    INSTR( UPPER( c.comment2 ), s.sentence ) > 0 ); 

SQLFIDDLE

如果你想进一步分解,那么你可以将comment1分成单词(而不是句子),并根据需要进行搜索;你只需要将正则表达式修改为'\S+\s',它就会分成单词。但是,我不认为那会特别有价值,除非你想要聚合单词匹配并需要匹配单词的阈值(因为大多数情况下,单个单词的匹配可能不重要)。 / p>

修改

这会将包含多个comment1字段的表格拆分为句子,然后将它们与包含comment2字段的单独表格进行比较。它不是特别有效(但是如果你在寻找效率,那么你可能想要预处理comment1字段以将它们分成句子/单词并将它们放在一个单独的表中。)

WITH ids AS (
  SELECT comment1,
         REGEXP_COUNT( comment1, '[^.]+(\.|$)' ) AS num_sentences
  FROM   comment1s
),
sentence_ids AS (
  SELECT LEVEL AS sentence_number
  FROM   DUAL
  CONNECT BY LEVEL <= ( SELECT MAX( num_sentences ) FROM ids )
),
sentences AS (
  SELECT comment1,
         sentence_number,
         UPPER(TRIM(REGEXP_SUBSTR( comment1, '[^.]+(\.|$)', 1, sentence_number ))) AS sentence
  FROM   ids i
         INNER JOIN
         sentence_ids s
         ON (i.num_sentences >= s.sentence_number )
)
SELECT c.comment2, s.comment1, COUNT(1) AS number_of_matched_sentences
FROM   comment2s c
       INNER JOIN
       sentences s
       ON ( INSTR( UPPER( c.comment2 ), s.sentence ) > 0 )
GROUP BY comment2, comment1
ORDER BY number_of_matched_sentences DESC, comment2, comment1;

SQLFIDDLE