>

비교하고 싶은 두 개의 열이 있으며 문자열이 동일하고 최대 차이 또는 한 문자의 LACK이있는 경우 플래그를 만들고 싶습니다. 예를 들면 다음과 같습니다.

select
    ,name1
    ,name2
    ,case when "name1 is like name2 except only 1 different character, or 
               lack of 1 character compared to the other" then 1 
          else 0 
     end same_flag
from example

<시간>

예제 출력 :

name1    -     name 2   -  sameflag   
john     -     jon      -        1    
sara     -     sarah    -        1    
filip    -     filis    -        1    
phillip  -     philis   -        0

vica-versa를 사용하고 싶습니다. 따라서 name1은 name2와 다를 수 있지만 다른 행에서는 name2가 name1과 다를 수 있습니다.

  • 답변 # 1

    utl_match 에서 기능 중 하나를 선택할 수 있습니다  패키지 :

    with data (name1, name2) as (
      select'john','jon' from dual union all    
      select'sara','sarah' from dual union all    
      select'filip','filis' from dual union all    
      select'phillip','philis' from dual 
    )
    select name1, name2, 
           utl_match.edit_distance(name1, name2) as ed,
           utl_match.edit_distance_similarity(name1, name2) as ed_similarity,
           utl_match.jaro_winkler(name1, name2) as jw,
           utl_match.jaro_winkler_similarity(name1, name2) as jw_similarity
    from data;
    
    

    반품 :

    NAME1   | NAME2  | ED | ED_SIMILARITY | JW   | JW_SIMILARITY
    --------+--------+----+---------------+------+--------------
    john    | jon    |  1 |            75 | 0.93 |            93
    sara    | sarah  |  1 |            80 | 0.96 |            96
    filip   | filis  |  1 |            80 | 0.92 |            92
    phillip | philis |  2 |            72 | 0.91 |            90
    
    

    필요에 따라 결과를 좋아하는 방법에 따라 다음과 같은 작업을 수행 할 수 있습니다.

    case when utl_match.edit_distance(name1, name2) < 2 then 1 else e end
    
    

    또는 백분율을 임계 값으로 사용하십시오 :

    case when utl_match.edit_distance_similarity(name1, name2) > 75 then 1 else e end
    
    

  • 답변 # 2

    이것은 매우 선형 적입니다 – 글자를 반복하고 그 차이를 계산합니다.

    이 내용을 업데이트했습니다. 이제 Richard와 Rchard도 같은 것으로 간주됩니다 ...

     FUNCTION compare_strings
       (P_string1        IN VARCHAR2
       ,P_string2        IN VARCHAR2)
      RETURN NUMBER
      IS
        l_long_string    VARCHAR2(100) ;
        l_short_string   VARCHAR2(100) ;
        l_diff_count     NUMBER := 0 ;
        l_result         NUMBER ;
        j                NUMBER := 1 ;
        k                NUMBER := 1 ;
      BEGIN
        IF LENGTH(P_string1) >= LENGTH(P_string2) THEN
          l_long_string := P_string1 ;
          l_short_string := P_string2 ;
        ELSE
          l_long_string := P_string2 ;
          l_short_string := P_string1 ;
        END IF ;
    
        --if one string is more than one char longer than the other then we must
        --have a difference
        IF LENGTH(l_long_string) - LENGTH(l_short_string) > 1 THEN
          l_result := 0 ;
        END IF ;
    
        FOR i IN 1..LENGTH(l_long_string) LOOP
    
         IF NVL(SUBSTR(P_string1,j,1),'##') != NVL(SUBSTR(P_string2,k,1),'##') THEN
           l_diff_count := l_diff_count + 1 ;
           --shift along one letter in the long string but stay put in the short string
           j := j + 1 ;
         ELSE
           --shift along on both strings
           j := j + 1 ;
           k := k + 1 ;
         END IF ;
         --EXIT WHEN l_diff_count > 1 ;
    
        END LOOP ;
        IF l_diff_count > 1 THEN
          l_result := 1;
        ELSE
          l_result := 0 ;
        END IF ;
        RETURN(l_result) ;
        --RETURN(l_diff_count) ;
      END compare_strings ;
    
    

  • 답변 # 3

    이것을 시도하고 둘 다의 길이를 세고 비교하십시오.

    PL/SQL에서 문자열에서 고유 문자 수와 이름을 찾는 방법

    실제로 내 대답은 아니지만 이것은 길이를 계산하고 차이를 수치로 비교할 수있는 기초를 제공합니다.

관련 자료

  • 이전 sql server - ISNULL 인쇄 *
  • 다음 python - 로봇 프레임 워크 - remoteswinglibrary를 가져올 수 없습니다