데이터베이스에서 퍼지 검색을 위해 이중 메타 폰을 사용 중입니다. 나는 이름의 테이블을 가지고 있으며 성 및 이름 모두 이미 이중 메타 폰 항목이 생성되어 있습니다 (그리고 트리거를 통해 업데이트됩니다). 내 응용 프로그램에서는 사용자가 성 및/또는 이름으로 검색 할 수 있도록 허용하고 있습니다.성/이름 조합을위한 이중 메타 폰으로 MSSQL을 조회하기위한 SQL
마지막 및 이름을 모두 처리 할 때 Double-Metaphone 인덱스에서 최상의 결과를 얻으려면 데이터베이스를 쿼리하는 가장 좋은 방법은 무엇입니까? 성을 기반으로하는 쿼리는 쉽습니다. DM 태그를 생성하고 데이터베이스를 쿼리하십시오. 그것은 처음부터 끝까지 질의하는 것이고 나는 미세 조정을하고 싶습니다.
사용자 입력이 [성] FIRSTNAME] 한글 이름 또는 LASTNAME + [이니셜, 이름의 조합 :
tblName
FirstName
LastName
MetaPhoneFN1
MetaPhoneFN2
MetaPhoneLN1
MetaPhoneLN2
출원 :
데이터베이스 레이아웃은 다음과 유사 , 이름의 일부].
Lastname: SMITH
FirstName: J or Jo or John or Johnathan
"J"를 첫 번째 이름으로 전달하면 "J %"와 (과) 일치하는 모든 이름 항목을 원합니다.
"JO"를 첫 번째 이름으로 전달하면 "JO %"와 (과) 일치하는 모든 이름 항목을 원합니다. 나는 DM에게 어쩌면 또한
또는 "존 %"를 사용하고 싶습니다 - 나는 FIRSTNAME으로 "JOHN"또는 "조나단"에 전달하면
?
저는 여기에 대한 첫 번째 제안에 대해 정말로 열려 있습니다. 결과가 가능한 한 좋고 사용자가 원하는 것을 반환하고 싶습니다.
데이터베이스에 마지막 + 이름 조합을 쿼리하는 가장 좋은 방법은 무엇입니까? 여기에 지금까지 왔 무엇의 샘플입니다 .. 나는 결과와 완전히 흥분하지 않다 : 내가 할 시도한 무엇
SELECT *
FROM tblName
WHERE
--There will always be a last name
(MetaPhoneLN1 = @paramMetaPhoneLN1
OR (CASE WHEN @paramMetaPhoneLN2 IS NOT NULL AND MetaPhoneLN2 = @paramMetaPhoneLN2 THEN 1
WHEN @paramMetaPhoneLN2 IS NULL THEN 0
END) = 1)
-- Match Firstname 1
AND (CASE WHEN @paramMetaPhoneFN1 IS NULL THEN 1
WHEN @paramMetaPhoneFN1 IS NOT NULL AND MetaPhoneFN1 = @paramMetaPhoneFN1 THEN 1
WHEN LEN(@paramMetaPhoneFN1) > 1 AND LEN(@paramMetaPhoneFN1) < 4 AND MetaPhoneFN1 LIKE @paramMetaPhoneFN1 + '%' THEN 1
WHEN LEN(@paramMetaPhoneFN1) = 1 THEN 1
END) = 1
-- Match Firstname 2
AND (CASE WHEN @paramMetaPhoneFN2 IS NULL THEN 1
WHEN @paramMetaPhoneFN2 IS NOT NULL AND MetaPhoneFN2 = @paramMetaPhoneFN2 THEN 1
WHEN LEN(@paramMetaPhoneFN2) > 1 AND LEN(@paramMetaPhoneFN2) < 4 AND MetaPhoneFN2 LIKE @paramMetaPhoneFN2 + '%' THEN 1
WHEN LEN(@paramMetaPhoneFN2) = 1 THEN 1
--ELSE 0
END) = 1
AND (CASE WHEN @paramFirstName IS NULL THEN 1
WHEN FirstName LIKE @paramFirstName + '%' THEN 1
--WHEN LEN(@paramMetaPhoneFN1) = 1 AND @paramFirstName IS NOT NULL AND LEN(@paramFirstName) > 1 AND FirstName LIKE @paramFirstName + '%' THEN 1
--ELSE 1
END) = 1
이 FIRSTNAME의 다른 유사에 대한 계정입니다. 그러나 내 결과는 내가 원하는 것만은 아니다.
더블 메타 폰 값을 생성/생성하기 위해 SQL/C# 등의 이중 메타 폰 구현을 많이 찾을 수 있었지만 그 값을 얻으면 실제로 데이터베이스를 실제로 쿼리하는 방법은 없습니다.
요약 :
내가 모두 LASTNAME 및 FIRSTNAME로 검색 - 나는 단지 성에서 더블 메타 폰의 경기를 위해 데이터베이스를 조회하고 싶습니다,하지만 난 많은 유연성을하고자 할 때 firstname도 전달 .. 첫 번째 이니셜? 처럼 들리다 ? 등등. 나는 제안과 SQL 예제에 열려있다.
UPDATE 1 : 나는 결과에 흥분 아니에요 말할 때 .. 무슨 말인지 나는 결과를 극대화하기 위해, 쿼리의 FIRSTNAME 부분을 공식화하는 방법을 잘 모르겠어요 것입니다. "WILL"을 검색하면 어떤 결과가 반환되어야합니까? WILLIAM, WILL, WILBERT ..하지만 워커는 아니지만 - 내가 여기있는 것과 함께, WILL -> FL과 WALKER IS [FLKR]하지만 윌리엄은 [FLM]이기 때문에 워커가 반환 될 것입니다.DM = DM이라면 WILLIAM도 반환하지 않을 것입니다. DM 길이가 <이면 LIKE를 수행하는 이유입니다.
기본적으로 다른 사람이이 문제에 부딪혔다는 것을 알고 다른 사람들이 생각해 낸 해결책을 확인하십시오.
먼저 초기 만 - 내가 불확실 해요 어디 여기 - 그 초기 로 시작하는 모든 firstnames 표시해야합니다 : 부분 이름 - 모든 firstnames이 부분부터 시작해야한다을? [부분 이름인지 어떻게 알 수 있습니까?] 전체 이름 - DM을 사용해야합니까?
* 그러나 내 결과는 내가 원하는 것이 아닙니다. * 샘플 데이터와 원하는 출력을 제공하면 도움이됩니다. – RedFilter
감사합니다. 조금 더 추가했습니다. 기본적으로 다른 사람이이 문제를 해결했는지, 사람들이 어떤 해결책을 제시했는지 알고 싶습니다.나는 거의 모든 검색의 약/생성/더블 메타 폰 값이기 때문에, 검색에 많은 행운을 가지고, 어디 DBDM = PASSEDINDM를 조회하지 않았습니다. 그 부분은 간단합니다. 이름과 성을 모두 볼 때 (2 가지 값), 좀 더 필요합니다! –