在SQL Server中使用正则表达式搜索给定列中的多个单词
我想在特定列上执行多个单词。给定的搜索字符串的顺序可能不同。例如,我想使用like运算符和正则表达式从books表中搜索书名Harry Potter Dream world 我知道,使用multiple-like运算符,我们可以使用下面的查询执行操作在SQL Server中使用正则表达式搜索给定列中的多个单词,sql,sql-server,regex,tsql,search,Sql,Sql Server,Regex,Tsql,Search,我想在特定列上执行多个单词。给定的搜索字符串的顺序可能不同。例如,我想使用like运算符和正则表达式从books表中搜索书名Harry Potter Dream world 我知道,使用multiple-like运算符,我们可以使用下面的查询执行操作 SELECT * FROM TABLE_1 WHERE bookname LIKE 'Harry Potter' OR LIKE 'Heaven world' 在本例中,我希望在单个查询中执行此操作。我还尝试了自由文本选项。当我使用self-
SELECT *
FROM TABLE_1
WHERE bookname LIKE 'Harry Potter' OR LIKE 'Heaven world'
在本例中,我希望在单个查询中执行此操作。我还尝试了自由文本选项。当我使用self-join时,这不会有用。请为我提供任何其他解决方案
还可以提供如何使用正则表达式在SQLServer中搜索多个单词。我尝试了多种选择。这对我没用。这个怎么样
DECLARE @phrase nvarchar(max) = 'Harry Potter Dream world'
;WITH words AS (
SELECT word = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM (
SELECT x =
CONVERT(XML, '<i>'
+ REPLACE(@phrase, ' ', '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
)
SELECT *
FROM
TABLE_1
CROSS APPLY (
SELECT found = 1
FROM words
WHERE bookname like '%' + word + '%') search
使用LIKE搜索可能会导致很多点击,特别是当您处理包含或
下面的代码将首先将搜索字符串拆分为单词,然后将书籍名称拆分为单词,并检查完整的单词点击率
请提供一些测试场景。。。这个问题怎么知道什么东西应该放在一起,什么东西不应该放在一起,哈利波特不会是哈利波特,你可能不想仅仅因为里面有一个哈利就找到肮脏的哈利?您必须提供更多详细信息,否则将很快关闭…这与包含搜索完全相同。我的意思是,不管作者是谁,我们都需要把DB的所有记录带来。你可以给《哈利波特》或《哈利波特》或《世界梦》或《梦幻世界》。等等。我想要所有包含任何一个单词或所有单词的记录。仍然不清楚。。。但是你真的想找到哈利的梦吗?在你的例子中,你知道,《哈利·波特》和《梦幻世界》是两本书,但可怜的人不知道这一点。仲夏夜的魔兽世界怎么样。你也想找到梦幻世界吗?嗨,这里还开着吗?你需要进一步的帮助吗?我也在想类似的事情,但这还远远不够。想象一下一条关于一个男孩的搜索字符串。你会发现所有标题都有一个。。。还是值得我投一票…顺便说一下:你的CTE可以简单一点。不需要.query“.”,不需要.value“/text[1]”。我会用一个稍微简单一点的电话回复…当然,你说的一切都是正确的。我只是简单地复制/粘贴了另一个解决方案中的内容,并对其进行了修改。我不想去想在一个大的表格中搜索a会是什么样子:D然而,合理的优化将是剔除所有短于3-4个字母的内容…是的,现在搜索Hrch Hrch Hrch。。。
DECLARE @tbl TABLE(ID INT, BookName VARCHAR(100));
INSERT INTO @tbl VALUES
(1,'Harry Potter')
,(2,'Dream world')
,(3,'A Midsumme Night''s Dream')
,(4,'Some other Book') --will not be found
,(5,'World of Warcraft');
DECLARE @phrase nvarchar(max) = 'Harry Potter o Dream world'
;WITH words AS (
SELECT word = z.i.value('.', 'nvarchar(max)')
FROM (SELECT CAST('<i>' + REPLACE(@phrase, ' ', '</i><i>') + '</i>' AS XML)) AS x(y)
CROSS APPLY x.y.nodes('/i') AS z(i)
)
SELECT *
FROM @tbl AS tbl
WHERE EXISTS
(
SELECT 1
FROM
(
SELECT z.i.value('.', 'nvarchar(max)')
FROM (SELECT CAST('<i>' + REPLACE(tbl.BookName, ' ', '</i><i>') + '</i>' AS XML)) AS x(y)
CROSS APPLY x.y.nodes('/i') AS z(i)
) AS checkWords(word)
WHERE EXISTS(SELECT 1 FROM words WHERE words.word=checkWords.word)
)