使用Oracle ..需要比较具有1个单词内容的列的每一行和具有段落作为行值的列的行

时间:2013-03-04 13:54:47

标签: sql oracle

我有一列有n行。每行都有一个单词作为其值。 例如“你好”,“那里”等 我有另一列有m行。 每行都有一个巨大的段落,我需要将第一列的每一行与后一列中的每一行进行比较。 基本上我需要找到段落中的特定单词,并识别第一列中有一个单词的行。

3 个答案:

答案 0 :(得分:0)

进行内部联接和类似情况。

当一个单词是另一个单词的一部分时,您可能会遇到问题。例如,单词“the”在“there”中,因此只要段落中有“there”字,即使没有出现单词“the”,对'%the%'的查询也将为真。我将在单词之前和之后使用空格来防止这种情况,但是除非您(a)在段落表中存储前导和尾随空格,或者(b)使用字符串连接,否则将在段落的开头和结尾处遗漏单词在查询中执行相同操作,这可能(或可能不会)影响性能。

select *
from word_table
  inner join paragraph_table
     on ' ' || paragraph_table.paragraph || ' ' like '% ' || word_table.word || ' %'

答案 1 :(得分:0)

不确定这是否是您想要的...我的示例计数发生了。或者在字符串中标出'world'。有两个发生。所以它会返回2.

SELECT count(*) word_count  FROM
(
 SELECT Distinct(Instr('Hello world! So happy to meet you world!', 'world', LEVEL)) str_cnt
  FROM dual
 CONNECT BY LEVEL < length('Hello world! So happy to meet you world!') 
 ) 
WHERE str_cnt > 0
/

这将返回4:

SELECT REGEXP_COUNT('Hello world world! So happy to meet you world world!', 'world') word_count
 FROM dual
/

如果你的任何行都有0到0的字数,那么你就有了一个胜利者 - 你在你的描述中找到了你所写的行。

答案 2 :(得分:0)

我假设您需要考虑行的开头或结尾处的单词,并且该段落的行将具有正常的标点字符。

这应该考虑到这些情况。

select
word
,paragraph
from 
(select
'(\W|^)' || word || '(\W|$)' as regexp
,word
from t1
) t
join t2 on
 (regexp_instr(paragraph, t.regexp) > 0)
;

如果您想要不区分大小写的搜索,那么您可以使用此查询

select
word
,paragraph
from 
(select
'(\W|^)' || word || '(\W|$)' as regexp
,word
from t1
) t
join t2 on 
    (regexp_instr(paragraph, regexp, 1, 1, 0, 'i') > 0)
;

Here is the sqlfiddle