SQL如何查找一个字段中的所有值是否以任何顺序存在于另一个字段中

时间:2011-08-12 14:38:34

标签: sql

我正在尝试将来自外部源的数据与内部源进行匹配。例如,一个表将具有值为“黑色蓝色”的字段,而另一个表具有值为“蓝色黑色”的字段。我试图弄清楚如何检查第一个表中的所有单个单词是否以任何顺序包含在第二个表的记录中。它并不总是需要比较的两个词,它也可能是3或4。我知道我可以使用游标并构建动态sql用AND keywod替换空格并使用contains函数,但我希望不必这样做。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

尝试执行以下操作:将空间中第一个表中的数据拆分为临时表变量。然后使用CHARINDEX确定每个单词是否包含在第二个表的记录中。然后只对第一个记录中的每个单词执行此操作,如果计数与成功检查相同,则您知道第一个记录中的每个单词都在第二个记录中使用。

编辑:使用拆分功能,例如:

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )

答案 1 :(得分:0)

这是您可以尝试的另一种方法,您可以对字符串的一些简单属性进行采样,例如,长度,空格数等;然后你可以使用交叉连接来创建所有可能的字符串匹配组合。

然后在你的where子句中你可以按匹配排序,本例中的最后一部分是使用patindex()函数检查第一个字符串的采样部分是否在第二个字符串中。

-- begin sample table variable set up
declare @s table(
id int identity(1,1)
,string varchar(255)
,numSpace int
,numWord int
,lenString int
,firstPatt varchar(255)
);

declare @t table(
id int identity(1,1)
,string varchar(255)
,numSpace int
,numWord int
,lenString int
);


insert into @t(string)
values ('my name');
insert into @t(string)
values ('your name');
insert into @t(string)
values ('run and jump');
insert into @t(string)
values ('hello my name is');

insert into @s(string)
values ('name my'); 
insert into @s(string)
values ('name your');
insert into @s(string)
values ('jump and run');
insert into @s(string)
values ('my name is hello');

update @s
set numSpace = len(string)-len(replace(string,' ',''));
update @s
set numWord = len(string)-len(replace(string,' ',''))+1;
update @s
set lenString = len(string);
update @s
set firstPatt = rtrim(substring(string,1,charindex(' ',string,0)));

update @t
set numSpace = len(string)-len(replace(string,' ',''));
update @t
set numWord = len(string)-len(replace(string,' ',''))+1;
update @t
set lenString = len(string);
-- end sample table variable set up  

-- select all combinations of strings using a cross join
-- and sort the entries in your where clause
-- the pattern index checks to see if the sampled string
-- from the first table variable is in the second table variable

select *
from
@s s cross join @t t
where 
s.numSpace = t.numspace
and s.numWord = t.numWord
and s.lenString = t.lenString
and patindex('%'+s.firstPatt+'%',t.string)>0;