정렬
중요하다
이 기능은 퍼블릭 프리뷰입니다.
적용 대상: Databricks Runtime 16.1 이상으로 표시됨
데이터 정렬은 문자열 비교가 수행되는 방법을 결정하는 규칙 집합입니다. 정렬 기능은 대/소문자나 악센트를 구분하지 않는 방식으로 문자열을 비교하거나, 특정 언어에 맞춘 순서로 문자열을 정렬하는 데 사용됩니다.
Azure Databricks의 문자열은 UTF-8로 인코딩된 유니코드 문자로 표시됩니다.
기본적으로 Azure Databricks는 문자열을 이진 UTF8 표현으로 비교합니다. 이를 UTF8_BINARY
데이터 정렬이라고 합니다.
UTF8_BINARY
비교는 많은 경우에 빠르고 적절하지만 모든 애플리케이션, 특히 언어 인식 정렬 또는 비교가 필요한 애플리케이션에는 적합하지 않을 수 있습니다.
언어 인식 비교 외에도 일반적인 사용 사례는 대/소문자를 구분하지 않는 비교를 요구하는 것입니다.
Azure Databricks에는 특히 이 목적을 위한 UTF8_LCASE
데이터 정렬이 있습니다.
비교하기 전에 문자열을 빠른 UTF8_BINARY
정렬을 사용하여 소문자로 변환합니다.
언어 인식 비교를 위해 Azure Databricks는 다음 기술을 사용합니다.
- 유니코드를 위한 국제 구성 요소(ICU) 라이브러리는 데이터 정렬을 계산합니다.
- 특정 로캘 인식 정렬을 위한 CLDR(Common Locale Data Repository) 테이블.
- LDML(유니코드 로캘 데이터 태그 언어) 데이터 정렬을 내부적으로 인코딩합니다.
이러한 기술은 SQL 문에서 사용할 수 있는 명명된 데이터 정렬 집합에 캡슐화됩니다.
대조 이름
LDML 사양으로 데이터 정렬을 식별하는 것은 복잡하고 읽기 어려울 수 있으므로 Azure Databricks에는 사용하기 쉬운 명명된 시스템 데이터 정렬 집합이 있습니다.
통사론
{ UTF8_BINARY |
UTF8_LCASE |
{ UNICODE | locale } [ _ modifier [...] ] }
locale
language_code [ _ script_code ] [ _ country_code ]
modifier
{ CS | CI | AS | AI }
UTF8_BINARY
UTF-8 바이트 표현을 기반으로 문자열을 바이트 단위로 비교하는 메타 로케일 이진 정렬입니다.
UTF8_BINARY
Azure Databricks에서 문자열 비교를 위한 기본 및 가장 간단한 데이터 정렬입니다.이 데이터 정렬에서 'A'(x'65') < 'B'(x'66') <... < 'Z'(x'90').
그러나 'Z'(x'90') <의 'a'(x'97'), 그리고 'A'(x'65') <>의 'a'(x'97')는 있습니다.
또한 'Ä'(x'C384')와 같은 문자는 이 데이터 정렬에서 'Z' 및 'z'보다 큽니다.
UTF8_LCASE
경량의 메타 로케일로, 문자열을 소문자로 변환한 후 UTF-8 바이트 표현을 사용하여 문자열을 비교하는 대소문자 구분이 없는 정렬입니다.
Azure Databricks에서 식별자에 사용되는 데이터 정렬입니다. 예를 들어:
ORDER BY col COLLATE UTF8_LCASE
에 해당합니다.
ORDER BY LOWER(col) COLLATE UTF8_BINARY
유니코드
ICU 루트 지역 설정입니다.
CLDR에서 '루트' 로캘(LDML 사양: 'und-u')으로 알려진 이 데이터 정렬은 언어에 구애받지 않는 순서를 적용하여 전반적으로 직관적이려고 합니다. 이 데이터 정렬에서는 문자들이 문자와 같이 그룹화됩니다. 예: 'a' < 'A' < 'Ä' < 'b'입니다. 'A'는 'a'에 해당하는 것으로 간주되지 않습니다. 따라서 데이터 정렬은 대/소문자를 구분합니다. 'a'는 'ä'에 해당하는 것으로 간주되지 않습니다. 따라서 데이터 정렬은 악센트를 구분합니다.
지역
CLDR 테이블을 기반으로 하는 로캘 인식 데이터 정렬입니다.
로캘은 언어 코드, 선택적 스크립트 코드 및 선택적 국가 코드로 지정됩니다. "
locale
는 대소문자를 구분하지 않습니다."language_code : ISO 639-1 언어 코드를두 글자입니다. script_code : ISO 15924 스크립트 코드를네 글자입니다. - country_code: 세 글자 ISO 3166-1 알파-3 국가 코드입니다.
한정자
대/소문자 구분 및 악센트 구분과 관련된 데이터 정렬 동작을 지정합니다.
- CS: 대/소문자를 구분합니다. 기본 동작입니다.
- CI: 대/소문자를 구분하지 않습니다.
- AS: 악센트를 구분함. 기본 동작입니다.
- AI: 악센트를 구분하지 않습니다.
CS
또는CI
, 그리고AS
또는AI
각각을 반드시 한 번만 순서에 상관없이 지정할 수 있습니다. 한정자 자체는 대/소문자를 구분하지 않습니다.
데이터 정렬을 처리할 때 Azure Databricks는 기본값을 제거하여 데이터 정렬 이름을 정규화합니다.
예를 들어 SR_CYR_SRN_CS_AS
이 SR
으로 정규화됩니다.
지원되는 데이터 정렬 목록은 지원되는 데이터 정렬을 참조하세요.
예제
-- You can fully qualify collations, and case doesn't matter.
system.builtin.unicode
-- Since all collations are system defined you don't need to qualify them
unicode
-- Using 2-letter language code only for german collation
DE
-- Using 2-letter language code and 3-letter country code for french-canadian collation
-- It is common to use lower case 2-letter language codes and upper case 3-letter country codes
-- But collation names are case insensitive
fr_CAN
-- Using 2-letter language code and 4-letter script code and 3-letter country code for traditional chinese in Macao
zh-Hant-MAC
-- Using a 2 letter german language code and 2 modifiers for case insensitive and accent insensitive
-- So 'Ä', 'A', and 'a' are all considered equal
de_CI_AI
-- Using back ticks is allowed, but unnecessary for builtin collations
`UTF8_BINARY`
기본 정렬 방식
기본 데이터 정렬은 문자열을 생성하는 STRING
매개 변수 없이 STRING
리터럴, 매개 변수 표식, 함수를 사용하고 COLLATE 절 없이 열, 필드 또는 변수 형식을 정의할 때 적용됩니다.
기본 정렬 방식은 UTF8_BINARY
에서 파생됩니다.
데이터 정렬 우선 순위
지정된 문자열에 사용할 데이터 정렬을 결정하려면 Azure Databricks에서 데이터 정렬 우선 순위 규칙을 정의합니다.
규칙은 데이터 정렬에 4가지 우선 순위를 할당합니다.
명시적
데이터 정렬은 COLLATE 식사용하여 문자열에 명시적으로 할당되었습니다.
예제
-- Force fast binary collation to check whether a vin matches a Ferrari vin COLLATE UTF8_BINARY LIKE 'ZFF%' -- Force German collation to order German first names ORDER BY vorname COLLATE DE
암시적
데이터 정렬은 열, 필드, 열 별칭, 변수또는 루틴 매개 변수 참조에 의해 암시적으로 할당됩니다. 여기에는 데이터 정렬이 없음
않는 한 하위 쿼리의 결과가 포함됩니다. 예제
-- Use the collation of the column as it was defined employee.name LIKE 'Mc%' -- Use the collation of the variable as it was defined. translate(session.tempvar, 'Z', ',')
기본
STRING
리터럴, 명명되거나 명명되지 않은 매개변수 표식또는 다른 유형의 함수에서 생성된STRING
.예제
-- A literal string has the default collation 'Hello' -- :parm1 is a parameter marker using session default collation EXECUTE IMMEDIATE 'SELECT :parm1' USING 'Hello' AS parm1; -- ? is a parameter marker using session default collation EXECUTE IMMEDIATE 'SELECT ?' USING 'Hello'; -- The result of a cast of a non-STRING to a STRING is a STRING with the default collation CAST(5 AS STRING) -- The date is converted to a string using the default collation to_char(DATE'2016-04-08', 'y') -- The collation of the session_user STRING is the default collation session_user()
할당된 데이터 정렬은 기본 데이터 정렬.
없음
다른 암시적 대조를 가진 둘 이상의
STRING
인수를 사용하는 함수, 연산자 또는 집합 연산(예:UNION
)의STRING
결과입니다.예제
-- Concatenating two strings with different explicit collations results in no collation SELECT fr || de AS freutsch FROM VALUES('Voulez vous ' COLLATE FR), 'Kartoffelsupp...' COLLATE DE) AS T(fr, de) -- A union of two strings with different excplicit collations results in no collation SELECT 'Voulez vous ' COLLATE FR UNION ALL SELECT 'Kartoffelsupp...' COLLATE DE
데이터 정렬 파생
STRING
결과에 대한 데이터 정렬을 파생할 때 데이터 정렬 우선 순위 규칙은 다음과 같은 방식으로 적용됩니다.
식일 경우:
위의 정의와 일치
데이터 정렬 및 우선 순위는 정의된 대로 지정됩니다.
단일
STRING
매개변수를 사용하는 함수 또는 연산자로,STRING
을 반환합니다.정렬 및 우선 순위는
STRING
매개 변수의 정렬 및 우선 순위와 같습니다.은 둘 이상의
STRING
매개 변수가 있는 함수 또는 연산자입니다.동일한 정렬 방식 및 우선 순위 설정
데이터 정렬 및 우선 순위는
STRING
매개 변수의 것입니다.데이터 정렬 또는 우선 순위가 서로 다릅니다.
C1
과C2
은 서로 다른 정렬 순서이고,D
는 기본 정렬 순서가 되도록 합니다. 우선 순위와 데이터 정렬은 다음 표에 의해 결정됩니다.정렬 순서 및 우선순위 C1 명시적 C1 암시적 D 기본값 없음 명시적 #C2 오류 C2 명시적 C2 명시적 C2 명시적 C2 암시적 명시적 C1 없음 C2 암시적 없음 D 기본값 C1 명시적 C1 암시적 D 기본값 없음 없음 C1 명시적 없음 없음 없음
예제
> CREATE TABLE words(fr STRING COLLATE FR, de STRING COLLATE DE, en STRING COLLATE EN);
> INSERT INTO words VALUES ('Salut', 'Hallo', 'Hello');
-- A literal string has the default collation
> SELECT collation('Ciao');
UTF8_BINARY
-- A function producing a STRING has the default collation
> SELECT collation(user());
UTF8_BINARY
-- Function modifying a STRING passes the collation through
> SELECT collation(upper('Ciao'));
UTF8_BINARY
-- Implicit collation (French) wins over default collation
> SELECT collation(fr || 'Ciao') FROM words;
FR
-- Explicit collation (French) wins over implicit collation (German)
> SELECT collation('Salut' COLLATE FR || de) FROM words;
FR
-- Implicit collation German collides with implicit collation French
-- The result is no collation
> SELECT collation(de || fr) FROM words;
null
-- Explicit collation (French) wins over default collation (Italian)
> SELECT collation('Salut' COLLATE FR || 'Ciao');
FR
-- Explicit collation (French) collides with explicit collation (German)
> SELECT collation('Salut' COLLATE FR || 'Hallo' COLLATE DE);
COLLATION_MISMATCH.EXPLICIT
-- The explicit collation wins over no collation
> SELECT collation('Ciao' COLLATE IT || (fr || de)) FROM words;
UTF8_BINARY
-- The implict collation (English) does not win over None
> SELECT collation(en || (fr || de)) FROM words;
null
-- The explicit collation (English) wins over Implicit collation anywhere in the expression
> SELECT collation((fr || ltrim('H' COLLATE EN, fr)) || fr) FROM words;
EN