在SQL中,通过文本列是否包含字符串中的任何单词来筛选行
我的SQL Server数据库表有一列文本,它是一个长文本字符串 搜索列表是一个用逗号分隔的字符串。我想获取文本列包含字符串中任意一个单词的行在SQL中,通过文本列是否包含字符串中的任何单词来筛选行,sql,sql-server,Sql,Sql Server,我的SQL Server数据库表有一列文本,它是一个长文本字符串 搜索列表是一个用逗号分隔的字符串。我想获取文本列包含字符串中任意一个单词的行 DECLARE @words_to_search nvarchar(50) SET @words_to_search = 'apple, pear, orange' SELECT * FROM myTbl WHERE text ??? --how to specify text contains @words_to_search 非常感谢。如
DECLARE @words_to_search nvarchar(50)
SET @words_to_search = 'apple, pear, orange'
SELECT *
FROM myTbl
WHERE text ??? --how to specify text contains @words_to_search
非常感谢。如果您运行的是SQL Server 2016或更高版本,您可以使用将要搜索的单词转换为单列表,然后使用类似的方法将其连接到表中: 请注意,在编写查询时,它将与Snapple中的apple进行匹配。您可以通过使连接条件更复杂一点来解决此问题:
SELECT *
FROM myTbl t
JOIN STRING_SPLIT(@words_to_search, ',') v
ON t.text LIKE '%[^A-Za-z]' + value + '[^A-Za-z]%'
OR t.text LIKE value + '[^A-Za-z]%'
OR t.text LIKE '%[^A-Za-z]' + value;
首先,我将使用exists,除非您想返回匹配的单词
第二,如果单词之间用空格分隔,则可以使用一个类似的比较:
select t.*
from t
where exists (select 1
from string_split(@words_to_search, ',') s
where ' ' + t.text + ' ' like '% ' + value + ' %'
);
对于更通用的分隔符,可以使用:
select t.*
from t
where exists (select 1
from string_split(@words_to_search, ',') s
where ' ' + t.text + ' ' like '%[^A-Za-z]' + value + '[^A-Za-z]%'
);
或者任何描述你的分离器的东西
请注意,单词列表由逗号分隔,而不仅仅是逗号。但是,根据您的描述,而不是样本数据,我只使用了一个“,”作为分隔符。也许可以考虑使用全文搜索、elasticsearch或lucenePerfect!这正是我想要的!非常感谢@zesla唯一需要注意的是,正如它目前所写的那样,它将匹配其他语言中的单词;您可能希望将连接条件更改为更复杂的条件,如本例所示。请参阅我的编辑。
select t.*
from t
where exists (select 1
from string_split(@words_to_search, ',') s
where ' ' + t.text + ' ' like '%[^A-Za-z]' + value + '[^A-Za-z]%'
);