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