2012-09-02 2 views
0

내가 읽은 책에서 약간의 코드가 발생하여 SUBSTRING() 함수의 동작을 묻습니다. 이 코드는 NYSIIS Replacement 테이블 (표음 인코딩 예제)을 검색하고 테이블의 'End' 'Mid'또는 'Start'위치를 기반으로 입력 문자열의 중간 'N 그램'을 대체합니다. 발췌가 아래에 제공된다 :T-SQL 하위 문자열() 동작

NYSIIS 교체 테이블 :

 
Location NGram Replacement 

Mid  A  A 
Mid  AW AA 
Mid  E  A 
Mid  EV AF 
Mid  EW AA 
Mid  I  A 
USE [AdventureWorks] 

DECLARE @Result NVARCHAR(100) = N'NEVADA'; 

DECLARE @Replacement NVARCHAR(10); 

DECLARE @i INT; 

SET @i = 1; 

WHILE @i <= LEN (@Result) 

BEGIN 

    SET @Replacement = NULL; 

    -- Grab the middle-of-name replacement n-gram 

    SELECT TOP(1) @Replacement = Replacement     
    FROM dbo.NYSIIS_Replacements       
    WHERE Location = N'Mid' 
     AND SUBSTRING(@Result, @i, LEN(NGram)) = NGram 
    ORDER BY LEN(NGram) DESC; 


    SET @Replacement = COALESCE(@Replacement, SUBSTRING(@Result, @i, 1)); 


    -- If we found a replacement, apply it 

    SET @Result = STUFF(@Result, @i, LEN(@Replacement), @Replacement) 

    -- Move on to the next n-gram 

    SET @i = @i + COALESCE(LEN(@Replacement), 1); 


END; 

SELECT @Result; 

SUBSTRING() 기능 표에 예를 들어 ('E'와 'EV' '를 NEVADA'를 이용하여 2 가능한 일치를 발견) 2 문자 스트링을 사용하는 것이 어떻게 '알 수 있습니까'? 이것이 SUBSTRING()의 예상되는 동작입니까?

변수는 'A'와 'AF'를 모두 포함한다고 가정하지만 디버깅 할 때는 첫 번째 반복에서는 'N'을, 두 번째에서는 'AF'만 포함하는 것으로 보입니다.

또한 TOPORDER BY이이 예제에 포함 된 이유를 이해할 수 없습니다. 그것들을 주석 처리하는 것은 동일한 결과를 가져온다.

답변

0

ORDER BY 절은 패턴의 길이를 사용하고 내림차순으로 정렬하므로 가장 긴 일치가 먼저 발생합니다. TOP 절은 결과를 첫 번째 행으로 제한합니다. ORDER BY 절을 제거하면 결과를 예측할 수 없게됩니다.

COALESCE

더 패턴 일치가 발견되지 않은 경우 대체 패턴, 또는 @Result 문자열의 위치 @i의 문자 하나에 @Replacement을 설정하는 데 사용됩니다.

+0

이는 의미가 있습니다. 감사. TOP 또는 ORDER BY가없는 결과는 순서가 매겨지지 않을 것입니다. 비록 내가 실행했을 때마다 2 글자 문자열 만 반환 했었지만 나는 가정하고 있습니다. – voided