【发布时间】:2016-03-22 22:05:26
【问题描述】:
请帮忙。
我正在使用 SQL Server 并且熟悉 CONTAINS 关键字。
我有一个表“Table1”,列值如下
1,'bla1 bla2 bla3 String1 bla4 bla5 bla6 String2 bla7 bla8 bla9'
2,'bla3 String1 bla4 String2 bla7 bla8 bla1'
3,'bla3 String2 bla4 String3'
我有另一个表“Table2”,只有一列,但具有动态值,例如
1,bla1
2,string1
3,bla3
或
1,string2
2,bla5
3,bla1
4,bla4
我只是想根据 Table2 中存在的所有值返回 Table1 中的行,这意味着它不是OR,而是AND - Table2 中的所有值都应该存在于 Table1 的列值中(它可以顺序不限)。
在上面的例子中,
- 如果根据 Table1 检查 Table2 的第一组,那么它应该只返回 Table1 的前 2 行
- 如果根据 Table1 检查 Table2 的第二组,那么它应该只返回 Table1 的第一行
因为 Table2 中的值之一在 Table1 的列值中不可用。
由于这两个表都是临时表变量,我无法在它们上添加FULL-TEXT INDEX,否则我可以使用
CONTAINS(Column, 'SearchString1 AND SearchString2 AND SearchString3 AND so on')
以下代码可以正常工作,但最多只能搜索 2 个搜索字符串。超过2,它不起作用。例如,如果我在下面的代码中有这样的
declare @str nvarchar(100) = ' Dr clark Nick '
DECLARE @Tab TABLE(Col NVARCHAR(50))
INSERT INTO @Tab
SELECT ' Dr. Nick Clark' UNION ALL
SELECT ' Dr. Nick SPACE Clark' UNION ALL
SELECT ' Dr. Clark SPACE Nick' UNION ALL
SELECT ' Dr. Clark Nick' UNION ALL
SELECT ' Dr. Nick' UNION ALL
SELECT ' Dr. Clark '
declare @str nvarchar(100) = ' Nick clark '
set @str = ltrim(rtrim(@str))
DECLARE @Search1 VARCHAR(MAX), @Search2 VARCHAR(MAX)
declare @t table(sno int, splitdata nvarchar(100))
insert into @t
SELECT
row_number() over (order by ltrim(rtrim(o.splitdata))) as sno,
ltrim(rtrim(o.splitdata)) AS splitdata
FROM
(SELECT CAST('<X>'+REPLACE(@str,' ','</X><X>')+'</X>' AS XML) AS Filter)F1
CROSS APPLY
( SELECT fdata.D.value('.','varchar(MAX)') AS splitdata
FROM f1.Filter.nodes('X') AS fdata(D)
) O
SELECT @Search1 = COALESCE(@Search1 + '%', '') + Splitdata FROM @t order by sno
SELECT @Search2 = COALESCE(@Search2 + '%', '') + Splitdata FROM @t order by sno desc
select * from @tab where col like '%'+@Search1+'%' or col like '%'+@Search2+'%'
【问题讨论】:
-
如果 table1 上的一行是“NickClarkNick”(没有空格),你会期待匹配吗?
-
任何数量的 Nick 或 Clark 都可以...但 Nick 和 Clark 都应该在场...有或没有空格..
标签: sql-server database contains