서식 지정 및 파싱을 위한 숫자 패턴

서식 지정 및 파싱을 위한 숫자 패턴

설명

to_number, to_char와 같은 함수는 문자열(string)과 Decimal 타입 값 사이의 변환을 지원해요. 이런 함수들은 두 타입 사이를 어떻게 매핑할지 알려주는 서식(format) 문자열을 인자로 받아요.

문법

숫자 서식 문자열은 다음 문법을 지원해요.

`  { ' [ MI | S ] [ $ ] 
      [ 0 | 9 | G | , ] [...] 
      [ . | D ] 
      [ 0 | 9 ] [...] 
      [ $ ] [ PR | MI | S ] ' }

요소

각 숫자 서식 문자열은 다음 요소를 포함할 수 있어요(대소문자 구분 없음):

  • 0 또는 9

09 사이의 기대되는 자릿수를 지정해요.

서식 문자열의 0 또는 9 시퀀스는 같은 크기 또는 더 작은 크기의 자릿수 시퀀스와 대응돼요. 0/9 시퀀스가 0으로 시작하고 소수점 앞에 있으면 자릿수를 정확히 일치시켜야 해요. 파싱할 때는 같은 크기의 자릿수 시퀀스만 대응되고, 서식을 적용할 때는 결과 문자열이 같은 크기에 도달하도록 자릿수 시퀀스 앞에 0을 채워 넣어요(left-padding). 그 외의 경우 0/9 시퀀스는 파싱할 때 같은 크기거나 더 작은 크기의 자릿수 시퀀스와 대응되고, 서식을 적용할 때는 소수점 앞이면 공백, 소수점 뒤면 0으로 자릿수 시퀀스를 채워서 결과 문자열을 만들어요. 자릿수 시퀀스가 0/9 시퀀스보다 크면, 서식을 적용할 때 그 시퀀스는 '#' 시퀀스가 된다는 점을 기억하세요.

  • . 또는 D

소수점의 위치를 지정해요. 이 문자는 한 번만 지정할 수 있어요.

파싱할 때 입력 문자열에 소수점이 포함되지 않아도 돼요.

  • , 또는 G

, 그룹(천 단위) 구분자의 위치를 지정해요.

각 그룹 구분자의 왼쪽과 오른쪽에 0 또는 9가 있어야 해요. 파싱할 때 입력 문자열은 숫자의 크기에 맞는 그룹 구분자와 일치해야 해요.

  • $

$ 통화 기호의 위치를 지정해요. 이 문자는 한 번만 지정할 수 있어요.

  • S

선택적인 '+' 또는 '-' 부호의 위치를 지정해요. 이 문자는 한 번만 지정할 수 있어요.

  • MI

선택적인 '-' 부호의 위치를 지정해요('+'는 없음). 이 문자는 한 번만 지정할 수 있어요.

서식을 적용할 때 양수 값에는 공백을 출력해요.

  • PR

음수 입력 값을 해당 문자열에서 꺾쇠 괄호(<1>)로 감싸서 표현해요.

양수 입력 값은 꺾쇠 괄호로 감싸지 않아요.

함수 타입과 오류 처리

  • to_number 함수는 입력 문자열과 서식 문자열 인자를 받아요. 입력 문자열이 주어진 서식과 일치해야 하며, 그렇지 않으면 오류를 일으켜요. 그런 다음 함수는 해당하는 Decimal 값을 반환해요.
  • try_to_number 함수는 입력 문자열과 서식 문자열 인자를 받아요. to_number 함수와 동일하게 동작하지만, 입력 문자열이 주어진 숫자 서식과 일치하지 않으면 오류를 일으키는 대신 NULL을 반환한다는 점만 달라요.
  • to_char 함수는 입력 Decimal과 서식 문자열 인자를 받아요. 그런 다음 함수는 해당하는 문자열 값을 반환해요.
  • 주어진 서식 문자열이 유효하지 않으면 모든 함수가 실패해요.

예시

다음 예시는 to_number, try_to_number, to_char SQL 함수를 사용해요.

이 예시 대부분에 쓰인 서식 문자열은 다음을 기대한다는 점을 기억하세요.

  • 시작 부분의 선택적인 부호,
  • 그다음 달러 기호,
  • 그다음 3~6자리 길이의 숫자,
  • 천 단위 구분자,
  • 소수점 이하 최대 두 자리.

to_number 함수

-- 음수에 통화 기호가 붙으면 서식 문자열의 문자에 대응돼요.
> SELECT to_number('-$12,345.67', 'S$999,099.99');
  -12345.67
 
-- '$' 기호는 선택 사항이 아니에요.
> SELECT to_number('5', '$9');
  Error: the input string does not match the given number format
 
-- 더하기 부호는 선택 사항이고, 소수 자릿수도 선택 사항이에요.
> SELECT to_number('$345', 'S$999,099.99');
  345.00
 
-- 이 서식은 최소 세 자리를 요구해요.
> SELECT to_number('$45', 'S$999,099.99');
  Error: the input string does not match the given number format
 
-- 이 서식은 최소 세 자리를 요구해요.
> SELECT to_number('$045', 'S$999,099.99');
  45.00
 
-- MI는 입력 문자열의 시작 또는 끝에 오는 선택적인 빼기 부호를 나타내요.
> SELECT to_number('1234-', '999999MI');
  -1234
 
-- PR은 선택적인 꺾쇠 괄호를 나타내요.
> SELECT to_number('9', '999PR')
  9

try_to_number 함수:

-- '$' 기호는 선택 사항이 아니에요.
> SELECT try_to_number('5', '$9');
  NULL
 
-- 이 서식은 최소 세 자리를 요구해요.
> SELECT try_to_number('$45', 'S$999,099.99');
  NULL

to_char 함수:

> SELECT to_char(decimal(454), '999');
  "454"

-- '99'는 더 작은 크기의 자릿수 시퀀스를 서식화할 수 있어요.
> SELECT to_char(decimal(1), '99.9');
  " 1.0"

-- '000'은 더 작은 크기의 자릿수 시퀀스에 0을 왼쪽으로 채워요.
> SELECT to_char(decimal(45.1), '000.00');
  "045.10"

> SELECT to_char(decimal(12454), '99,999');
  "12,454"

-- 더 큰 크기의 자릿수 시퀀스는 '#' 시퀀스가 돼요.
> SELECT to_char(decimal(78.12), '$9.99');
  "$#.##"

-- 'S'는 끝에 올 수 있어요.
> SELECT to_char(decimal(-12454.8), '99,999.9S');
  "12,454.8-"

> SELECT to_char(decimal(12454.8), 'L99,999.9');
  Error: cannot resolve 'to_char(Decimal(12454.8), 'L99,999.9')' due to data type mismatch:
  Unexpected character 'L' found in the format string 'L99,999.9'; the structure of the format
  string must match: [MI|S] [$] [0|9|G|,]* [.|D] [0|9]* [$] [PR|MI|S]; line 1 pos 25

출처: 문서

더 알아보기 (Learn more)