2017-03-29 3 views
0

공통점에 나타나는 문자 수를 기준으로 두 개의 주소 열을 찾고 있습니다. 아래에는 데이터가 나타나는 방식과 의도 한 결과가 나와 있습니다. 어떤 해결책을 주시면 감사하겠습니다. 도움으로T-SQL : 일치하는 값을 일치하는 값을 비교하십시오.

enter image description here

+0

그냥 확인하는 관심이 경우, UDF가 : 123 푸 세인트/321 Foooo 세인트 만 8이 아닌 10, 마찬가지로 123 공간이 문자로 계산하지 않습니다이다 Foooo 세인트/321 푸 세인트 만 8 , 10 아닌가요? –

+0

즉, 정확한 공백은 문자로 간주되지 않습니다. –

+1

https://www.simple-talk.com/blogs/string-comparisons-in-sql-the-longest-common-substring/? 참고 : 이것은 비교적 비싼 계산 대상입니다. –

답변

0

A A 테이블 반환-기능 및 크로스 적용

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 행복한 도움이되었습니다. 건배 :) –

관련 문제