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
,那么您仍然会将他包括在结果集中。“獾”应该匹配“獾”吗?如果“坏”和“獾”都是搜索词怎么办?使用通配符匹配与解析字符串中的单词不同。