开发者

SQL How to find if all values from one field exist in another field in any order

开发者 https://www.devze.com 2023-03-27 12:47 出处:网络
I am trying to match data from an external source to an in ho开发者_运维问答use source. For example one table would have a field with a value of \"black blue\" and another table would have a field wit

I am trying to match data from an external source to an in ho开发者_运维问答use source. For example one table would have a field with a value of "black blue" and another table would have a field with a value of "blue black". I am trying to figure out how to check if all individual words in the first table are contained in a record the 2nd table in any order. It's not always two words that need to be compared it could be 3 or 4 as well. I know I could use a cursor and build dynamic sql substituting the space with the AND keywod and using the contains function but I'm hoping not to have to do that.

Any help would be much appreciated.


Try doing something like this: Split the data from the first table on the space into a temporary table variable. Then use CHARINDEX to determine if each word is contained in the second table's record. Then just do this for each word in the first record and if the count is the same as the successful checks then you know every word from the first record is used in the second.

Edit: Use a Split function such as:

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
  )


Here's another method you could try, you could sample some simple attributes of your strings such as, length, number of spaces, etc.; then you could use a cross-join to create all of the possible string match combinations.

Then within your where-clause you can sort by matches, the final piece of which in this example is a check using the patindex() function to see if the sampled piece of the first string is in the second string.

-- 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;
0

精彩评论

暂无评论...
验证码 换一张
取 消