2011-08-12 2 views
0

外部ソースから社内ソースにデータを照合しようとしています。例えば、1つのテーブルは「黒青」の値を有するフィールドを有し、別のテーブルは「青黒」の値を有するフィールドを有する。私はどのように最初のテーブルのすべての個々の単語が任意の順序で2番目のテーブルのレコードに含まれているかどうかを確認しようとしています。それは必ずしも3つまたは4つの比較される必要がある2つの単語ではありません。私はカーソルを使用して動的SQLを構築し、AND keywodでスペースを代用し、contains関数を使用することができますが、私はそれを行う必要はないと思っています。SQLあるフィールドのすべての値が別のフィールドに任意の順序で存在するかどうかを調べる方法

ご協力いただければ幸いです。

答えて

0

次のようにしてください。空白の最初のテーブルのデータを一時テーブル変数に分割します。次に、CHARINDEXを使用して、各単語が2番目の表のレコードに含まれているかどうかを判別します。次に、最初のレコードの各単語についてこれを行います。カウントが成功したチェックと同じ場合、最初のレコードのすべての単語が2番目のレコードで使用されていることがわかります。

編集:などのSplit関数を使用します。

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

私は最初のテーブルを一度に1レコードずつループし、各レコードに対して一時テーブル変数を作成する必要がありますか?もしそうなら、それは私が避けたいものです。 – Colin

+0

スプリット機能を含むように私の答えを編集しました。 – RKeast

+0

ありがとう私は同様の分割機能を持っていますが、私は一度に何百ものレコードを実行する単一のバッチプロセスでこの機能をどのように組み込むことができるのかまだ分かりません。たぶん私は正しく説明していないか、あなたの答えを完全に理解していません。私はもう少しそれを使って遊びます。 – Colin

0

は、ここでは、そのような長さ、など、あなたの文字列のいくつかの簡単な属性、スペースの数などをサンプリングでき、あなたが試みることができる別の方法です;可能な文字列の組み合わせをすべて作成するためにクロス結合を使用できます。

次にwhere句の中で一致するものを並べ替えることができます。この例では、patindex()関数を使用して最初の文字列のサンプリングされた部分が2番目の文字列に含まれているかどうかを確認します。

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

私はあまりにも急だった。これは、@sの最初の単語が@tにある場合にのみ機能します。 2番目または3番目の単語が比較値と同じ長さの単語であるが同じ正確な単語でない場合は、一致しないはずのヒットを返します。 – Colin

関連する問題