EDITDISTANCE
EDITDISTANCE
EDITDISTANCE는 두 입력 문자열 사이의 Levenshtein 거리를 계산하는 문자열 함수예요. 즉 한 문자열을 다른 문자열로 바꾸는 데 필요한 단일 문자 삽입·삭제·대체 횟수를 의미해요.
본문
카테고리: 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 |
+---------------------------------------+