2015-02-06 2 views
0

필자가 요구하는 것은 전달 된 문자열과 비교하여 임의의 수의 문자와 일치하는 열의 문자열을 검색 할 수 있도록하는 것입니다. 예를 들어T-SQL의 접두어가 아닌 임의의 문자열 검색

는 :

나는 Hello을 통과하면 내 테이블 열이있는 경우 쿼리에 비해 Tell 두 문자열에 ll을 일치하는 Tell을 선택해야합니다. 주문이 없기 때문에 단일 문자의 일치에도 결과를 줄 수 있습니다. 두 문자가 일치해야하는 두 문자가 일치해야하는 경우 두 문자가 임의의 위치 즉, youour에서 임의로 선택되지 않으면 두 문자 모두에 동일한 순서로 ou이 있으므로 두 문자가 일치합니다. 나는 Westbrookbrook 찾아보실 수 있습니다

while begin(@counter <= lengthOfPassedString) 
    select Name from column where column LIKE + '%' + SUBSTRING(@parameterFromUser, 1, @counter) + '%' 
end 

즉 그러나 위의 코드를 루프의 길이까지 내 쿼리에 Substring를 사용하는 지금까지 생각했지만 내가 문자열로 krook을 통과하면 krook에서 rook를 찾을 수 없습니다 무엇 westbrook은 표의 열에있었습니다.

SUBSTRING 메서드의 시작 위치에도 중첩 된 while 루프를 사용하는 것이 좋습니다. 퍼포먼스는 (lengthofstring)^2이 될 것이지만 더 좋은 접근 방법을 알고 싶어합니다. 그것은 단지 9 자까지 입력 작동

: 당신은 두 글자 이상 일치 할 필요는 가정

+0

param1 = 'abc'를 사용하면 'a' 또는'b' 또는 'c'문자가 포함 된 단어가 반환되어야합니까? 또는 적어도 두 개 : ab 또는 bc와 일치해야합니까? 전달 된 문자열의 최대 길이에 대해 가정 할 수 있습니까? 그런 다음 루프없이 입력 매개 변수를 따라 2 자마다 매우 긴 OR을 사용할 수 있습니다. –

+0

@ Nick.McDermaid : 적어도 하나 이상 일치해야합니다. 예, 우리는 전달 된 문자열의 최대 길이를 가정 할 수 있습니다. 무차별 기술을 이해하고 그것이 내 질문에서 중첩 된 while 루프를 말했을 때의 의미입니다. 끝 위치와 시작 위치에 대한 외부 루프 카운터를 유지하는 내부 루프가 있지만 더 좋은 방법은 무엇입니까? – Simran

+0

실제로 하나 이상입니다. 그 이유는 일치하고 일치하지 않는 문자의 비율을 차지하게 될 것이므로 모든 문자가 일치해야합니다. 그 두 문자가 일치해야하는 경우 두 개 이상의 문자가 연속적이어야하며 ou가 두 문자열에 동일한 순서로 존재하기 때문에 두 문자가 일치합니다. 즉 임의의 위치에서 무작위로 선택되지 않습니다. – Simran

답변

0

, 여기에 루프를 필요로하지 않는 무력 방법입니다. 나는 당신이 생각을 가지고 있다고 생각합니다.

이것은 내가 생각할 수있는 유일한 비 루프 솔루션입니다. 당신은 약간의 미친 것 FOR XML 일을 할 수 있을지도 모르지만 나는 그것이 맨 위에 있다고 생각합니다.

또한 CTE를 사용하거나 시스템 테이블에서 선택하여 집계 테이블을 생성하고이를 루프처럼 사용할 수 있습니다. 그 해결책을보고 싶다면 알려주십시오.

declare @p varchar(50) 
SET @p = 'Krook' 

select * from 
(
select 'Westbrook' G 
UNION ALL 
select 'Tell' G 
UNION ALL 
select 'Something' G 
) F 
where (
f.G LIKE REPLACE('%' + substring(@p,1,2) + '%','%%','') 
OR 
f.G LIKE REPLACE('%' + substring(@p,2,2) + '%','%%','') 
OR 
f.G LIKE REPLACE('%' + substring(@p,3,2) + '%','%%','') 
OR 
f.G LIKE REPLACE('%' + substring(@p,4,2) + '%','%%','') 
OR 
f.G LIKE REPLACE('%' + substring(@p,5,2) + '%','%%','') 
OR 
f.G LIKE REPLACE('%' + substring(@p,6,2) + '%','%%','') 
OR 
f.G LIKE REPLACE('%' + substring(@p,7,2) + '%','%%','') 
) 
+0

McDermaid : 고맙습니다. 그러나 그것은 정확히 중첩 된 while 루프가 수행하는 것, 즉 시작 위치를 변경하는 것과 같습니다. 나는이 부분 문자열 접근법을 얻었고 여기서의 퍼포먼스는 똑같을 것이다.e (lengthofstring) 제곱하지만 일부 내장 함수이거나 가능한 전체 텍스트 검색이 내가 완전히 알지 못하는 것보다 더 잘할 수 있습니까? – Simran

+0

FOR XML 접근 방식이란 무엇입니까? 나는 그것에 대해 알지 못합니다. 어떻게 작동하는지 더 알고 싶습니다. – Simran

+0

차이점은 다른 테이블에 조인 할 수 있고 쿼리 최적화 프로그램에서 최적화 할 수있는 하위 테이블/뷰입니다. 절차 적 솔루션은 일반적으로 할 수 없습니다. –

관련 문제