我的数据库表有两个最大2000的varchar字段。
评论1 和评论2
这两个字段都包含大量包含非结构化数据的字段。
情况是Comment2字段中可能存在所有Comment1数据。
我正在寻找一个SQL查询或函数来帮助我比较这两个非结构化数据字段,例如我可以找到匹配,其中Comment1的部分或全部数据位于Comment2
例如: 假设Comment1包含数据:
您好,我的名字是xyz。我在abc公司工作。我是一名经理。
Comment2字段包含:
您好,我的名字是xyz。我在abc公司工作。我是一名经理。我的责任是保持记录。我经理了两位前辈。
在这里,我们看到Comment1的全部或部分数据位于Comment2中。因此,我应该在比较中找到匹配。
由于
答案 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 );
如果你想进一步分解,那么你可以将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;