Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中,通过文本列是否包含字符串中的任何单词来筛选行_Sql_Sql Server - Fatal编程技术网

在SQL中,通过文本列是否包含字符串中的任何单词来筛选行

在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 非常感谢。如

我的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  

非常感谢。

如果您运行的是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]%'
             );