2017-05-12 7 views
0

역과 같은 약자를 취급한다. 산타, 또는 엄마와 같습니다. Maria 또는 Ma와 같습니다.where 절의 약자

SELECT * FROM Table1 A WITH(NOLOCK) WHERE A.Name LIKE '%ma%' 

이 쿼리는 마리아에 대한,하지만 문제는 또한 이름 marie

사례 1이 포함되어 포함되어 결과가 maria, mama. 그 반대가 될 것이다 사용자 입력 ma을.

사례 2 : 사용자 입력 출력이 Ma. Teresa 또는 Maria Teresa 또는 Ma Teresa하고 같은 것 Mariasta 시나리오에 간다.

사례 3 : 사용자 입력 sta 결과는 santa, sta.sta이고 그 반대의 경우도 마찬가지입니다.

사례 4 : 약어없이 (호세) 사용자 입력 일반 이름이 결과가 Jose

이 문제에 대한 어떤 생각 같은 것? 또는이 문제에 대한 최선의 접근 방법은 무엇입니까?

감사합니다.

+2

질문을 편집하고 샘플 데이터와 원하는 결과를 제공하십시오. –

+0

제 질문을 편집했습니다. 정말 고마워요. – Joseph

답변

0

으로 NormalizedName 열의 정규화 된 값을 검색 할 수있는 이름을 제공

이 검색되었는지 확인하는 기능이다 ma, ma. ....

CREATE FUNCTION [dbo].[StringContains] 
(
-- Add the parameters for the function here 
@String1 VARCHAR(MAX), 
@String2 VARCHAR(MAX) 
) 
RETURNS BIT 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @Result BIT = 0 

DECLARE @IsContain INT = 0 

DECLARE @Equivalents TABLE 
(
    ID INT IDENTITY(1,1), 
    Text1 VARCHAR(50), 
    Text2 VARCHAR(50) 
) 
INSERT INTO @Equivalents (Text1, Text2) 
VALUES ('ma. ','maria'), 
('ma. ','ma '), 
('ma ','maria'), 
('sta. ','santa'), 
('sta. ','sta '), 
('sta ','santa') 

DECLARE @ID INT = 1 
DECLARE @TOTAL INT = (SELECT COUNT(1) FROM @Equivalents) 
WHILE @ID <= @TOTAL 
BEGIN 
    DECLARE 
     @Temp1 VARCHAR(MAX) = @String1, 
     @Temp2 VARCHAR(MAX) = @String2, 
     @Text1 VARCHAR(50), 
     @Text2 VARCHAR(50) 
    SELECT TOP 1 
     @Text1 = Text1, 
     @Text2 = Text2 
    FROM @Equivalents 
    WHERE ID = @ID 

    IF @Temp1 LIKE '%'[email protected]+'%' AND @Temp2 LIKE '%'[email protected]+'%' 
    BEGIN 
     SET @String2 = REPLACE(@Temp2,@Text2,@Text1) 
    END 
    ELSE IF @Temp1 LIKE '%'[email protected]+'%' AND @Temp2 LIKE '%'[email protected]+'%' 
    BEGIN 
     SET @String2 = REPLACE(@Temp2,@Text1,@Text2) 
    END 

    IF @String1 LIKE '%'[email protected]+'%' 
    BEGIN 
     SET @IsContain += 1 
    END 

    SET @ID += 1 
END 

SET @Result = (CASE WHEN @IsContain > 0 THEN 1 ELSE 0 END) 
RETURN @Result 
END 

를 포함하고 이것은 쿼리입니다.

DECLARE @Text VARCHAR(MAX) = 'maria' 
SELECT TOP 100 FullName,* FROM dbo.Table1 WITH(NOLOCK) 
WHERE dbo.StringContains(FullName,@Text) = 1 
1

당신은 약자에 대한 기간을 가지고, 그래서 이것은 당신이 원하는 것을 할 수 있습니다

WHERE ' ' + A.Name + ' ' LIKE '% Ma. %' 
2

한 가지 방법은 모든 약어의 목록과 그들이에 해당하는 것입니다.

기본적으로 약어를 전체 이름으로 확장하는 별도의 테이블을 작성하십시오.

Abbrevs 및 열 Abbrev, Name입니다.

귀하의 예를 들어 이들 행을 포함합니다 :

Abbrev Name 
ma  Maria 
ma  Ma. 
ma. Maria 
ma. Ma 
sta Santa 
sta Sta. 
sta. Santa 
sta. sta 

그런 다음 사용자가 제공하는 문자열을 더한이 이름의 가능한 모든 동의어를 찾습니다. 이런 식으로 뭔가가 :

DECLARE @ParamInput nvarchar(255); 
SET @ParamInput = 'ma'; 

SELECT * 
FROM YourTable 
WHERE 
    YourTable.Name = @ParamInput 
    OR YourTable.Name IN 
    (
     SELECT Abbrevs.Name 
     FROM Abbrevs 
     WHERE Abbrevs.Abbrev = @ParamInput 
    ) 
; 

당신은 사용자가 정의 할 수와 Abbrevs 테이블을 편집 할 수 있습니다. 사용자 입력 테이블 모두 약어를 가질 수 있으며, 당신이 검색을 위해 LIKE 아닌 간단한 =를 사용해야하는 경우


후 나는 다음과 같은 일을 할 것입니다.

여전히 별도의 약어를 확장 테이블 (또는 특정 이름의 가능한 약어 오히려 목록)가있을 것이다 : 나는 주어진 이름을 정규화하는 기능을 할 것이다

Abbrev Name 
ma  Maria 
ma. Maria 
sta Santa 
sta. Santa 

그 외에도

. 이 함수는 주어진 이름에서 가능한 약어를 찾아 확장합니다.

예를 들어 Ma. Teresa이 주어진 경우 함수는 Abbrevs 테이블을 사용하여 Maria Teresa을 반환합니다.

기본 테이블에는 약자를 가질 수있는 원래 이름의 Name 필드가 있습니다. 이 함수로 채워지는 다른 (계산 된 또는 지속 된) 열 NormalizedName을 추가하겠습니다. 실제로 나는 정상적인 영속 열과 같은 열을 만들고 주 Name 열이 변경되면 값을 업데이트하는 트리거를 작성했습니다. 정규화의 한 걸음은 모든 문자열을 대문자로 가져 오는 것이 었습니다. 모든 점, 쉼표, 대시 및 기타 기호를 버리고 두 칸을 한 칸으로 바꾸는 것과 같은 다른 규칙을 작성할 수 있습니다.

원래 Name 값만 사용자에게 표시합니다. 사용자가, I는 동일한 기능을 이용하여 지정된 이름을 정상화 검색하고 간단한

WHERE NormalizedName LIKE '%'[email protected]+'%' 
+0

사용자가'Maria'를 입력하면 출력은'Ma. Teresa' 또는'Maria Teresa'또는'Ma Teresa'? LIKE IN 기능이 있습니까? – Joseph

+0

@ JAlc, 나는 대답을 확대하고 내가 사용했던 아이디어를 추가했다. –

+0

감사합니다. – Joseph