Sql server 在列中或跨多行进行包含SQL的匹配

Sql server 在列中或跨多行进行包含SQL的匹配,sql-server,tsql,search,Sql Server,Tsql,Search,我肯定以前有人问过这个问题,但我不知道如何搜索它 首先,我不想实现全文搜索。该数据库包含多种语言,包括中文和日文,这给全文索引带来了巨大的问题 我有一张如下表: 表注释: UserID int CommentText nvarchar(400) 我想对这个表进行搜索,找到任何匹配多个单词的内容。通常我会做一些类似的事情 select * from Comment where CommentText like '%potato%' and CommentText like '%badger%

我肯定以前有人问过这个问题,但我不知道如何搜索它

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

我有一张如下表:

注释

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
但是如果这两个词在不同的行中,我需要做如下的事情

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行
  • 对于同一个UserID,一个单词在多行中(因此,即使同一个单词多次出现,它也会返回多个匹配项)
  • 我的问题是:对于多个单词,如何进行通配符搜索并确保所有单词至少与给定用户ID匹配一次

    提前谢谢


    我正在考虑使用CTE来抓取所有包含匹配项的行,并针对给定的用户ID对其进行搜索,但我不知道是否可以找到更有效的方法。

    仅仅发布问题就让我想到了答案

    select distinct UserID from (
        select UserID FROM Comment where CommentText like '%java%' 
        UNION 
        select UserID FROM Comment where CommentText like '%python%' 
    ) as a
    

    一种简单的方法是使用条件聚合:

    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的全文功能


    wht如果
    从Comment中选择distinct UserID,其中CommentText如“%java%”或CommentText如“%python%”我认为这种逻辑不正确。例如,如果一个用户匹配了
    java
    ,而不是
    python
    ,那么您仍然会将他包括在结果集中。“獾”应该匹配“獾”吗?如果“坏”和“獾”都是搜索词怎么办?使用通配符匹配与解析字符串中的单词不同。