我有一列有 n 行。每行都有一个单词作为其值。例如“你好”、“那里”等我还有另一列有 m 行。每行都有一个很大的段落,我需要将第一列的每一行与后一列的每一行进行比较。基本上我需要在段落中找到特定的单词,并确定在第一列的行中存在甚至 1 个单词的行。
问问题
679 次
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)
;
于 2013-03-04T16:10:20.170 回答