2015-02-04 2 views
1

문자열을 포함하는 일부 열이있는 테이블이 있습니다 (예 : nvarchar). 이제 사용자는 할당 된 열에서이 문자열을 검색하는 함수에 문자열을 전달합니다. 해당 문자열이 데이터베이스에 있는지 확인하고 싶지만 문제가 100 % 일치해야 할 필요는 없습니다. 예를 들어 보겠습니다. 사용자가 Johnathon 문자열을 전달했으며 John 문자열이이 데이터베이스에 있습니다.TSQL에서 일치하는 문자열

그래서 기본적으로 일치하는 문자의 수를 얻고 싶습니다. JohnJohnathon의이 특별한 경우에. 그것은 4 일치하고 5 일치하지해야합니다.

이 문제를 해결하기위한 지침을 얻을 수 있습니까?

편집 : 내가 추측 할 수있는 것은 열에서 가장 일치하는 문자열을 검색하면 일치하는 비율을 할 수 있다는 것입니다. 따라서 일치하는 문자와 일치하지 않는 문자의 수를 무시하고 일치하는 문자열을 데이터베이스에서 검색하는 데 초점을 맞추면 작동합니다. Johnathon는 사용자가 통과하고, John 데이터베이스에 존재되면서

Forexample는, 나는 확실히 Like 여기 운영자하지만 열에서 가장 일치하는 문자열을 검색하고 반환 코드 조각을 사용할 수 없습니다.

+1

봐 : https://msdn.microsoft.com를 /ju-library/ms187384.aspx –

+0

@juergend : 답변 해 주셔서 감사합니다. 그러나 문제가 해결되지 않습니다. 문자열에 일치하는 결과는 문자열의 일부 연속 문자가 일치 할 때까지 일치시켜야하며 무작위로 문자열에서 선택하면 안됩니다. – Simran

+0

SQL이 문자열 조작에 적합하지 않습니다. 그러나 SQL에서 호출 할 수있는 C# 코드를 작성할 수 있습니다. 이것은 [CLR 함수] (https://msdn.microsoft.com/en-us/library/ms189876.aspx) – Andomar

답변

1

당신은 그것을 이런 식으로 수행 할 수 있습니다

SELECT Name, LEN(Name) AS Equals, (LEN('Johnathon') - LEN(Name)) AS NotEquals 
FROM TableName 
WHERE 'Johnathon' LIKE '%' +Name +'%' 

아니면 다음 두 가지를 비교하려는 경우 : SOUNDEX에

DECLARE @parameter NVARCHAR(MAX) = N'Johnathon' 

SELECT Name, 
CASE WHEN LEN(Name) > LEN(@parameter) THEN LEN(@parameter) ELSE LEN(Name) END AS Equals, 
CASE WHEN LEN(Name) > LEN(@parameter) THEN LEN(Name) - LEN(@parameter) ELSE LEN(@parameter) - LEN(Name) END AS NotEquals 
FROM TableName 
WHERE Name LIKE '%' + @parameter + '%' OR @parameter LIKE '%' +Name +'%' 
+0

나는 그것이 너무 일할 것이라고 생각한다 : 고마워요 톤 :) 이것을 시험해 봅시다. – Simran

+0

오, 내가 잘못했다 :(사용자가 Johni와 Johnat을 전달한 경우에는 아무 것도 맞지 않을 것입니다. – Simran

+0

표준 SQL 함수를 통해 수행 할 수 없으므로 대신 전체 텍스트 검색을 수행 할 수 있습니다. –

0

당신은이 방법을 시도 할 수 있습니다 : -

IF EXISTS(SELECT * FROM TAB_NAME WHERE COL LIKE '%JOHN%') 
SELECT LEN('JOHN') AS MATCHED, (LEN(COL) - LEN('JOHN')) AS UNMATCHED 
FROM TAB_NAME; 

나는이 방법이 문제를 해결할 수 있다고 생각합니다. @DeadlyJesus 언급

+0

예를 확인해보십시오. Johnathon이 사용자와 John이 데이터베이스에 전달한 문자열로 언급했습니다. Like 연산자에 Johnathon이 있으면 John과 절대로 일치하지 않습니다. – Simran

1

Levenshtein 거리가 적합 할 수 있지만, 대안은 단지 2 문자열의 시작부터 characaters 일치 계산하는 것입니다. 간단한 사용자 정의 함수가 이것을 할 수 있습니다.

create function dbo.MatchStart(@input1 nvarchar(100), @input2 nvarchar(100)) returns int as 
begin 

    declare @i int 
    set @i = 1 

    if (@input1 is not null and @input2 is not null) 
    begin 
     while (1 = 1) 
     begin 
      if (@i > len(@input1) or @i > len(@input2)) 
       break 

      if (substring(@input1, @i, 1) <> substring(@input2, @i, 1)) 
       break; 

      set @i = @i + 1 
     end 
    end 

    return @i - 1 

end 
go 

declare @testTable table (text1 nvarchar(100)) 
declare @userInput nvarchar(100) 

insert @testTable values 
    (null), 
    (''), 
    ('John'), 
    ('Johnathan'), 
    ('JohXXX'), 
    ('Fred'), 
    ('JxOxHxN') 

set @userInput = 'Johnathan' 

select text1, dbo.MatchStart(text1, @userInput) as result from @testTable 
+0

@HughJones - 죄송합니다. 편집하는 편이 낫습니다. 아빠가 옆에 올린 흔적이 있습니다. (아빠와 같은 이름의 사람이 아닌 한 :). 예, 손가락이 엇었다! –

+0

@Rhys Jones : 두 번째 매개 변수가 테이블 열을 조사해야하고 사용자가 전달하지 않아야하므로이 방법이 제 경우에는 작동하지 않는다고 생각합니다. – Simran