SQL - 包含在列中或跨多行的匹配

问题描述 投票:0回答:2

我确定之前已经问过,但我不知道如何搜索它。

首先,我不想实现全文搜索。该数据库包含多种语言,包括中文和日文,这对全文索引构成了巨大的问题。

我有一个如下表:

Comment

UserID int
CommentText nvarchar(400)

我想对这个表进行搜索,找到匹配多个单词的任何内容。通常我会做类似的事情

select * 
from Comment 
where CommentText like '%potato%' and CommentText like '%badger%'

但如果这两个词在不同的行中,我需要做类似的事情

select 
    UserID, count(UserID ) 
from 
    Comment
where 
    CommentText like '%potato%' or CommentText like '%badger%'
group by 
    UserID 
having 
    count(UserID ) > 1

但是如果这些单词有时在同一行并且有时会分布在多行中,我该如何判断这两个单词是否匹配?

案例:

  1. 这两个词都在一行中。
  2. 一个字在第1行,另一个字在第2行,用于相同的UserID
  3. 对于相同的UserID,一个单词在多行中(因此即使它是多次相同的单词,它也会返回多个匹配)

我的问题是:对于多个单词,如何进行通配符搜索并确保所有单词对于给定的UserID至少匹配一次?

提前致谢

我正在考虑使用CTE来获取包含匹配项的所有行并将其连接到给定的用户ID,但我不知道是否可以找到更高效的内容。

sql-server tsql search
2个回答
0
投票

处理此问题的简单方法是使用条件聚合:

SELECT UserID
FROM Comment
GROUP BY UserID
HAVING
    SUM(CASE WHEN CommentText LIKE '%java%'   THEN 1 ELSE 0 END) > 0 AND
    SUM(CASE WHEN CommentText LIKE '%python%' THEN 1 ELSE 0 END) > 0;

HAVING子句中的每个总和都会跟踪您想要匹配的每个单词。仅当至少一个记录具有肯定匹配时,对于两个单词,用户才会在结果集中出现。

请注意,如果您打算继续沿着这条路走,那么您应该研究SQL Server的全文功能。

https://docs.microsoft.com/en-us/sql/relational-databases/search/full-text-search


-1
投票

只是发布问题让我想到了答案。

select distinct UserID from (
    select UserID FROM Comment where CommentText like '%java%' 
    UNION 
    select UserID FROM Comment where CommentText like '%python%' 
) as a
© www.soinside.com 2019 - 2024. All rights reserved.