EDITDISTANCE

EDITDISTANCE

EDITDISTANCE는 두 입력 문자열 사이의 Levenshtein 거리를 계산하는 문자열 함수예요. 즉 한 문자열을 다른 문자열로 바꾸는 데 필요한 단일 문자 삽입·삭제·대체 횟수를 의미해요.

출처: Snowflake SQL Reference

본문

카테고리: String & binary 함수 (Matching/Comparison)

참고: 다른 일부 메트릭(예: Damerau-Levenshtein 거리)과 달리, 문자 전위(transposition)는 고려하지 않아요.

구문 (Syntax)

EDITDISTANCE( <string_expr1> , <string_expr2> [ , <max_distance> ] )

인자 (Arguments)

필수:

<string_expr1>, <string_expr2> — 입력 문자열이에요.

선택:

<max_distance> — 계산할 최대 거리를 지정하는 정수 표현식이에요. 문자열 사이의 거리가 이 숫자를 넘으면 함수는 거리 계산을 멈추고 최대 거리를 그대로 반환해요.

이 인자를 지정하는 것은 LEAST( EDITDISTANCE( <string_expr1>, <string_expr2> ), <max_distance> )를 호출하는 것과 같은 효과예요.

음수를 지정하면(즉 -<n>), 함수는 최대 거리로 0을 사용해 0을 반환해요.

사용 시 유의사항 (Usage notes)

  • EDITDISTANCE 함수의 실행 시간은 입력 문자열 길이의 곱에 비례해요.
  • 성능 향상을 위해 Snowflake는 4096자 이하의 입력 문자열 사용을 권장해요.
  • 128MB보다 긴 입력 문자열은 오류를 일으킬 수 있어요.
  • 선택 인자 max_distance를 사용해 계산되는 거리의 상한을 정할 수도 있어요.

대조(collation) 세부 사항

영향 없음. 알파벳에 이중자·삼중자(헝가리어의 "Dz", "Dzs" 등)가 있는 언어에서, 각 이중자·삼중자의 각 문자는 하나의 다중 문자 글자로 취급되지 않고 독립적인 문자로 취급돼요.

결과는 문자열의 문자만을 기준으로 하며, 문자열의 대조(collation) 지정은 반영하지 않아요.

예시 (Examples)

다음 예시는 ed 테이블의 s와 t 열에 있는 문자열 사이의 거리를 계산해요.

마지막 두 열은 max_distance 인자로 계산할 최대 거리를 지정했어요:

  • max_distance가 3이면, 문자열 사이의 거리가 3 이상일 때 함수는 3을 반환해요(아래 참고).
  • max_distance가 음수면(아래의 -1처럼), 함수는 최대 거리로 0을 사용해 0을 반환해요.
SELECT s,
       t,
       EDITDISTANCE(s, t),
       EDITDISTANCE(t, s),
       EDITDISTANCE(s, t, 3),
       EDITDISTANCE(s, t, -1)
  FROM ed;
+----------------+-----------------+--------------------+--------------------+-----------------------+------------------------+
|      S         |        T        | EDITDISTANCE(S, T) | EDITDISTANCE(T, S) | EDITDISTANCE(S, T, 3) | EDITDISTANCE(S, T, -1) |
|----------------+-----------------+--------------------+--------------------+-----------------------+------------------------|
|                |                 | 0                  | 0                  | 0                     | 0                      |
| Gute nacht     | Ich weis nicht  | 8                  | 8                  | 3                     | 0                      |
| Ich weiß nicht | Ich wei? nicht  | 1                  | 1                  | 1                     | 0                      |
| Ich weiß nicht | Ich weiss nicht | 2                  | 2                  | 2                     | 0                      |
| Ich weiß nicht | [NULL]          | [NULL]             | [NULL]             | [NULL]                | [NULL]                 |
| Snowflake      | Oracle          | 7                  | 7                  | 3                     | 0                      |
| święta         | swieta          | 2                  | 2                  | 2                     | 0                      |
| [NULL]         |                 | [NULL]             | [NULL]             | [NULL]                | [NULL]                 |
| [NULL]         | [NULL]          | [NULL]             | [NULL]             | [NULL]                | [NULL]                 |
+----------------+-----------------+--------------------+--------------------+-----------------------+------------------------+

다음 예시는 두 문자열 사이의 거리가 2 이상이면 FALSE를 반환해요. max_distance가 2로 지정되었기 때문에 거리가 2 이상으로 판정되면 함수는 거리 계산을 멈춰요. (입력 문자열 사이의 실제 거리는 6이에요.)

SELECT EDITDISTANCE('future', 'past', 2) < 2;
+---------------------------------------+
| EDITDISTANCE('FUTURE', 'PAST', 2) < 2 |
|---------------------------------------|
| False                                 |
+---------------------------------------+

더 알아보기