2011-10-05 43 views
1

我想在之后知道很多搜索如何使用标准TSQL将不同的输入变量匹配到一个sql行。下面是这种情况:将输入的多个变体匹配到一个sql行

我有我的SQL行下面的文字:I love

然后我有以下3个输入所有这些都应返回匹配到该行:

想告诉你,我们都爱StackOverflow的

“在罗全中号已经与StackOverflow的”

我真的StackOverflow的

正如你可以看到我已经加粗的比赛的原因,试图更清楚你为什么它们匹配。在I'mI故意匹配太多,所以如果我们可以在匹配中包含它将是很好。

我想折中一下,我用下面的TSQL完成输入字符串:

-- Create a space delimited string for testing 
declare @str varchar(max) 
select @str = 'I want to tell you we all love StackOverflow' 
-- XML tag the string by replacing spaces with </x><x> tags 
declare @xml xml 
select @xml = cast('<x><![CDATA['+ replace(@str,' ',']]></x><x><![CDATA[') + ']]></x>' as xml) 
-- Finally select values from nodes <x> and trim at the same time 
select ltrim(rtrim(mynode.value('.[1]', 'nvarchar(12)'))) as Code 
from (select @xml doc) xx 
cross apply doc.nodes('/x') (mynode) 

这让我所有的话作为单独的行,但后来我不能工作了怎么办查询匹配这些。

因此,从这一点或任何其他方式的匹配所需的任何帮助将不胜感激!

UPDATE:

@freefaller指着我的正则表达式路线,创造一个功能我已经能够得到一点再向前,因此+1 @freefaller,但是我现在需要知道我可以得到它看我所有的表行,而不是硬编码输入“我爱”我现在有以下选择语句:

SELECT * FROM dbo.FindWordsInContext('i love','I want to tell you we all love StackOverflow',30) 
SELECT * FROM dbo.FindWordsInContext('i love','I''m totally in love with StackOverflow',30) 
SELECT * FROM dbo.FindWordsInContext('i love','I really love StackOverflow',30) 

以上返回我的匹配次数和的情况下字符串匹配,因此上面的第一个选择返回:

Hits Context 
1  ...I want to tell you we all love StackOv... 

因此,根据我们现在有上述的事实,任何人都可以告诉我如何让这个函数查看匹配的所有行,然后返回匹配的行/行?

+0

关于“你喜欢小部件吗?我喜欢。” (相反的顺序) –

+0

使用上面的函数,不幸的是,这似乎非常复杂:-( – Apqu

+0

我认为对于我的需求以任何顺序匹配会给我最好的结果,但我可以妥协,以获得* Something * working。 – Apqu

回答

1

我设法想出答案我自己的问题所以以为我想我会张贴在这里万一别人有类似的要求未来。基本上它依赖于SQL-CLR正则表达式功能,并且对性能影响最小。

在服务器上首先启用SQL-CLR如果还没有(你需要系统管理员):

--Enables CLR Integration 
exec sp_configure 'clr enabled', 1 
GO 
RECONFIGURE 
GO 

然后,你将需要创建SQL的组件(不要忘记设置路径从D:\SqlRegEx.dll和使用SAFE权限设置,因为这是最严格,最安全的权限集,但不会细讲这里):

CREATE ASSEMBLY [SqlRegEx] FROM 'D:\SqlRegEx.dll' WITH PERMISSION_SET = SAFE 

现在创建实际的功能,你会拨打:

CREATE FUNCTION [dbo].[RegexMatch] 
(@Input NVARCHAR(MAX), @Pattern NVARCHAR(MAX), @IgnoreCase BIT) 
RETURNS BIT 
AS EXTERNAL NAME SqlRegEx.[SqlClrTools.SqlRegEx].RegExMatch 

最后并完成和回答我的问题,然后我们就可以运行下面的TSQL:

SELECT * 
FROM your_table 
WHERE dbo.RegexMatch(@search, REPLACE(your_field, ' ', '.*?'), 1) = 1 
SELECT * 
FROM your_table 
WHERE dbo.RegexMatch(@search, REPLACE(REVERSE(your_field), ' ', '.*?'), 1) = 1 

我希望这会帮助别人在什么应该是今后一个简单的搜索选项。

1

一种选择是通过SQLCLR对象as explained here使用正则表达式。

我从来没有自己创建过SQLCLR对象,所以不能评论这种方法的简便性。不过,我,正则表达式的忠实球迷,并建议他们大多数文本搜索/操作

编辑使用:针对的评论,我没有SQLCLR的经验,但假设你得到工作,东西像下面这个简单的未经测试 TSQL可能工作...

SELECT * 
FROM mytable 
WHERE dbo.RegexMatch(@search, REPLACE(myfield, ' ', '.*?')) = 1 
+0

感谢您的意见,我有一个简短的看,它当然似乎是一个可行的选择,任何人在社区足够了解正则表达式和tsql来提供一个例子? – Apqu

+0

@Aracas感谢这个代码片段,感谢我编辑了最终TSQL – freefaller

+0

的一个*可能*示例,遗憾的是,它不会返回任何字符串的任何结果。我很惊讶没有人知道,我希望我知道更多关于SQL能够实现您的正则表达式的建议 – Apqu