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

时间:2017-12-22 09:13:24

标签: sql-server tsql search

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

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

我有一张如下表格:

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

    提前致谢

    我想CTE抓住所有包含匹配的行并为给定的用户ID连接它们,但我不知道我是否能找到更有效的东西。

2 个答案:

答案 0 :(得分: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 :(得分:-1)

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

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