在SQL Server中使用正则表达式搜索给定列中的多个单词

在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-

我想在特定列上执行多个单词。给定的搜索字符串的顺序可能不同。例如,我想使用like运算符和正则表达式从books表中搜索书名Harry Potter Dream world

我知道,使用multiple-like运算符,我们可以使用下面的查询执行操作

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)
)