2017-03-29 20 views
0

共通点に表示される文字の数に基づいて2つのアドレスの列を「得点する」と考えています。データがどのように表示されるか、どんな解決策も高く評価されます。助けを借りてT-SQL:戻り値の一致の比較

enter image description here

+0

興味があればUDFは:スペースは文字としてカウントされません、123はFooセント/ 321 Fooooセントはわずか8、ない10で、同様に123 Fooooセント/ 321 Fooのセントは8です、ない10? –

+0

それは正しいスペースは文字としてカウントされません。 –

+1

https://www.simple-talk.com/blogs/string-comparisons-in-sql-the-longest-common-substring/?注:これは計算するのに比較的高価なものです –

答えて

0

テーブル値-機能とクロスが適用

Declare @YourTable table (Address1 varchar(25),Address2 varchar(25)) 
Insert Into @YourTable values 
('123 Foo St','12 Foo'), 
('123 Foo St','Bar Street'), 
('123 Foo St','321 Foo St'), 
('123 Foo St','Bar Lane') 


Select A.* 
     ,B.* 
From @YourTable A 
Cross Apply (
       Select Cnt = count(*) 
       From (Select Distinct RetSeq,RetVal From [dbo].[udf-Str-Parse-Char](replace(A.Address1,' ',''))) C1 
       Join (Select Distinct RetVal From [dbo].[udf-Str-Parse-Char](replace(A.Address2,' ',''))) C2 
        on C1.RetVal=C2.RetVal 
      ) B 

戻り

Address1 Address2 Cnt 
123 Foo St 12 Foo  5 
123 Foo St Bar Street 2 
123 Foo St 321 Foo St 8 
123 Foo St Bar Lane 0 

だけで確認することが

CREATE FUNCTION [dbo].[udf-Str-Parse-Char] (@String varchar(max)) 
Returns Table 
As 
Return (
    with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
      cte2(N) As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From cte1 a,cte1 b,cte1 c,cte1 d,cte1 e,cte1 f) 

    Select RetSeq=N 
      ,RetVal=Substring(@String,N,1) 
    From cte2 
) 
--Max 1 Million Observations 
--Select * from [dbo].[udf-Str-Parse-Char]('this is a string') 
+0

ありがとうございます。私はthis.Iで働くことができます私は投票しましたが、新しい参加者としてそれは公に登録しませんでした。再度、感謝します。 –

+0

@ M.Butterハッピーは助けました。乾杯:) –

関連する問題