0

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

4

3 回答 3

0

做一个内连接和类似的条件。

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

select *
from word_table
  inner join paragraph_table
     on ' ' || paragraph_table.paragraph || ' ' like '% ' || word_table.word || ' %'
于 2013-03-04T14:01:51.917 回答
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,那么您就获得了胜利——您确定了您在描述中所写的行。

于 2013-03-04T15:37:18.317 回答
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)
;

这是sqlfiddle

于 2013-03-04T16:10:20.170 回答