본문 바로가기

[오라클 레퍼런스 함수] NLSSORT - 정렬 키(collation key) 반환

by ㅇㅍㅍ 2023. 8. 10.
[오라클 레퍼런스 함수] NLSSORT - 정렬 키(collation key) 반환
728x90

 

NLSSORT

 

구문

NLSSORT(char [, 'nlsparam' ])

 

목적

NLSSORT 함수는 문자열 값 char과 명시적 또는 암시적으로 지정된 정렬에 대한 정렬 키(collation key)를 반환합니다. 정렬 키는 지정된 정렬에 따라 char를 정렬하는 데 사용되는 바이트 문자열입니다. 정렬 키의 특성은 주어진 정렬에 따라 이진 순서로 비교했을 때 생성된 두 정렬 키의 상대 순서가 주어진 정렬에 따라 소스 문자 값의 상대 순서와 동일하다는 것입니다.

char 및 'nlsparam' 모두 CHAR, VARCHAR2, NCHAR 또는 NVARCHAR2 데이터 유형 중 하나가 될 수 있습니다.

'nlsparam'의 값은 다음과 같은 형식이어야 합니다.

 

'NLS_SORT = collation'

 

여기서 collation은 언어적 정렬 또는 BINARY의 이름입니다. NLSSORT는 지정된 정렬을 사용하여 정렬 키를 생성합니다.

'nlsparam'을 생략하면 이 함수는 인수 char의 파생된 정렬을 사용합니다. BINARY를 지정하면 이 함수는 아래에 설명된대로 char 값을 그대로 RAW로 캐스팅하고 필요한 경우 잘라냅니다.

'nlsparam'을 지정하는 경우 리지널 컬레이션 이름에 _ai 접미사를 추가하여 음성 감지를 무시하는 정렬을 요청하거나 _ci 접미사를 추가하여 대소문자를 구분하지 않는 정렬을 요청할 수 있습니다. 더 많은 정보는 Oracle Database Globalization Support Guide를 참조하십시오. 강조 및 대소문자 구분 없는(case-insensitive) 정렬에 대한 자세한 내용이 포함되어 있습니다. 강조 및 대소문자 구분 없는 정렬을 ORDER BY 쿼리 절과 함께 사용하는 것은 권장되지 않습니다. 이는 결정론적이지 않은 정렬 순서를 초래할 수 있습니다.

반환된 정렬 키는 RAW 데이터 유형입니다. 주어진 char 값에 대한 정렬 키의 길이는 NLSSORT에 의해 반환된 RAW 값의 최대 길이를 초과할 수 있습니다. 이 경우 NLSSORT의 동작은 초기화 매개변수 MAX_STRING_SIZE의 값에 따라 달라집니다. MAX_STRING_SIZE = EXTENDED인 경우 반환 값의 최대 길이는 32767바이트입니다. 만약 정렬 키가 이 한계를 초과하면 함수가 "ORA-12742: unable to create the collation key" 오류와 함께 실패합니다. 이 오류는 입력 문자열이 짧은 경우에도 보고될 수 있으며 해당 문자열에 매우 높은 분해 비율을 가진 유니코드 문자가 포함된 경우에도 발생할 수 있습니다.

 

참고:

ORA-12742 오류가 보고되는 경우 및 해당 오류로 인해 발생할 수 있는 응용 프로그램 가용성 문제를 방지하는 방법에 대한 자세한 내용은 Oracle Database Globalization Support Guide를 참조하세요.

만약 MAX_STRING_SIZE = STANDARD인 경우 반환 값의 최대 길이는 2000바이트입니다. 반환할 값이 제한을 초과하는 경우, NLSSORTchar의 최대 접두사 또는 초기 부분 문자열에 대한 정렬 키를 계산하여 계산 결과가 최대 길이를 초과하지 않도록 합니다. 단일 언어의 정렬, 예를 들어 FRENCH의 경우, 접두사 길이는 일반적으로 1000자입니다. 다중 언어의 정렬, 예를 들어 GENERIC_M의 경우, 접두사는 일반적으로 500자입니다. 유니코드 정렬 알고리즘 (UCA)의 경우, 예를 들어 UCA0610_DUCET의 경우, 접두사는 일반적으로 285자입니다. 정확한 길이는 정렬과 char에 포함된 문자에 따라 낮을 수도 높을 수도 있습니다.

MAX_STRING_SIZE = STANDARD인 경우의 동작은, 언어적 순서를 찾기 위해 비교를 위해 정렬 키 (NLSSORT 결과)가 비교되는 두 문자열 값이 접두사에서 다르지 않으면 일부 다른 문자 위치에서 차이가 있을지라도 동일하다고 간주됩니다. NLSSORT 함수가 비교 조건을 위해 언어적 순서를 찾는 데 암묵적으로 사용되므로 BETWEEN 조건, IN 조건, ORDER BY, GROUP BYCOUNT(DISTINCT)과 같은 작업은 긴 문자열 값에 대해서만 근사 결과를 반환할 수 있습니다. 이러한 작업의 결과가 정확하게 보장되어야 하는 경우에는 데이터베이스를 MAX_STRING_SIZE = EXTENDED를 사용하도록 마이그레이션하십시오.

MAX_STRING_SIZE 초기화 매개변수에 대한 자세한 내용은 "Extended Data Types"을 참조하십시오.

이 함수는 CLOB 데이터를 직접 지원하지 않습니다. 그러나 CLOB는 암묵적 데이터 변환을 통해 인수로 전달될 수 있습니다.

 

참고:

 

예제

이 함수는 문자열의 이진 값이 아닌 언어별 정렬 순서를 기반으로 정렬 및 비교 작업을 지정하는 데 사용할 수 있습니다. 다음 예제는 두 개의 값을 포함하는 테스트 테이블을 생성하고, NLSSORT 함수에 의해 반환된 값들이 어떻게 정렬될 수 있는지 보여줍니다:

CREATE TABLE test (name VARCHAR2(15));
INSERT INTO test VALUES ('Gaardiner');
INSERT INTO test VALUES ('Gaberd');
INSERT INTO test VALUES ('Gaasten');

SELECT *
  FROM test
  ORDER BY name;

NAME
---------------
Gaardiner
Gaasten
Gaberd

SELECT *
  FROM test
  ORDER BY NLSSORT(name, 'NLS_SORT = XDanish');

NAME
---------------
Gaberd
Gaardiner
Gaasten

 

다음 예제는 NLSSORT 함수를 비교 작업에 사용하는 방법을 보여줍니다:

SELECT *
  FROM test
  WHERE name > 'Gaberd'
  ORDER BY name;

no rows selected

SELECT *
  FROM test
  WHERE NLSSORT(name, 'NLS_SORT = XDanish') > 
        NLSSORT('Gaberd', 'NLS_SORT = XDanish')
  ORDER BY name;

NAME
---------------
Gaardiner
Gaasten

 

만약 동일한 언어 정렬 순서를 사용하여 자주 NLSSORT를 비교 작업에서 사용한다면, 다음과 같은 효율적인 대체 방법을 고려해볼 수 있습니다: 데이터베이스 또는 현재 세션에 대해 NLS_COMP 매개변수를 LINGUISTIC로 설정하고, 세션에 대한 NLS_SORT 매개변수를 원하는 정렬 순서로 설정하세요. Oracle 데이터베이스는 현재 세션 동안 모든 정렬 및 비교 작업에 해당 정렬 순서를 기본적으로 사용할 것입니다:

ALTER SESSION SET NLS_COMP = 'LINGUISTIC';
ALTER SESSION SET NLS_SORT = 'XDanish';

SELECT *
  FROM test
  WHERE name > 'Gaberd'
  ORDER BY name;

NAME
---------------
Gaardiner
Gaasten

 

참고:

정렬 순서(sort sequences)에 대한 정보는 Oracle Database Globalization Support Guide를 참조하세요.


출처: 오라클 레퍼런스

원문 링크: Oracle NLSSORT 함수 문서

 

반응형

댓글