SQL 포맷 모델

SQL 포맷 모델 (SQL Format Models)

Snowflake에서 SQL 포맷 모델(즉, 포맷 문자열을 담은 리터럴)은 숫자 값을 텍스트 문자열로, 또는 그 반대로 변환하는 방식을 지정하는 데 사용돼요. 그래서 TO_CHAR, TO_VARCHARTO_DECIMAL, TO_NUMBER, TO_NUMERIC 변환 함수의 인수로 지정할 수 있습니다.

참고: Snowflake는 날짜·시간·타임스탬프에 대해서도 제한된 SQL 포맷 모델 지원을 제공해요(날짜 & 시간 함수, 변환 함수 참고). SQL 포맷 모델을 사용해 날짜·시간·타임스탬프를 완전히 포맷하는 지원은 향후 릴리스에 추가될 예정이에요.

출처: Snowflake SQL Reference

본문

포맷 모델의 구성 요소

포맷 모델은 포맷 요소(format elements)와 리터럴(literals)의 문자열로 구성돼요.

포맷 요소 (Format elements)

포맷 요소는 숫자 및/또는 문자(대부분 대소문자 무시)의 시퀀스이며, 경우에 따라 기호도 포함해요. 포맷 요소는 서로 직접 연결(concatenate)할 수 있습니다. 일부 포맷 요소는 인쇄와 입력 텍스트 매칭을 제어하기 위해 모든 포맷 모델에서 공통으로 사용되고, 다른 요소는 캐스팅하는 값의 유형에 따라 특정 용도가 있어요.

포맷 리터럴 (Format literals)

포맷 리터럴은 다음 조합으로 구성될 수 있는 시퀀스예요.

  • 큰따옴표로 구분된 임의 문자 문자열(큰따옴표는 인접한 두 개의 큰따옴표로 표현).
  • 다음 기호 중 하나 이상:
기호/문자 참고
. (마침표) 고정 위치 숫자 모델에서 0, 9, X 뒤에 오면 포맷 요소로 취급되고, 그 외에는 그대로 보존.
, (쉼표) 숫자 모델에서 0, 9, X 뒤에 오면 포맷 요소로 취급되고, 그 외에는 그대로 보존.
; (세미콜론) 항상 그대로 보존.
: (콜론) 항상 그대로 보존.
- (마이너스) 항상 그대로 보존.
= (등호) 항상 그대로 보존.
/ (슬래시) 항상 그대로 보존.
( (왼쪽 괄호) 항상 그대로 보존.
) (오른쪽 괄호) 항상 그대로 보존.

리터럴은 포맷 모델에서 위치한 바로 그 자리에 있는 그대로 항상 인쇄돼요.

예를 들어 마이너스 부호를 숫자 앞이 아니라 뒤에 인쇄하려면 MI 요소를 사용해요. MI는 숫자가 음수일 때 마이너스 부호를 넣을 위치를 나타냅니다.

select to_varchar(-123.45, '999.99MI') as EXAMPLE;

출력은 기본값 -123.45 대신 123.45-처럼 보일 거예요.

포맷 수정자와 일반 공백 처리 (Format modifiers and generic space handling)

모든 포맷 모델에 공통인, 인쇄와 입력 텍스트 매칭을 제어하는 특수 포맷 요소는 다음과 같습니다.

요소 설명
_ (밑줄) 아무것도 인쇄하지 않음; 입력에서 선택적 공백.
FM 채움 모드(fill mode) 수정자; 모델에서 수정자 뒤에 오는 요소들에 대해 컴팩트/채움 모드를 토글.
FX 정확 일치(exact match) 수정자; 모델에서 수정자 뒤에 오는 요소들에 대해 느슨(lax)/정확(exact) 모드를 토글.

참고: 채움 모드 수정자는 텍스트 최소 숫자 포맷 요소(TM, TM9, TME)에는 효과가 없어요.

채움 모드 수정자로 출력 문자열 인쇄

기본적으로 채움 모드는 fill로 설정되고, FM 채움 모드 수정자는 이를 compact로 토글하며, 반복 사용 시 다시 fill로 토글해요. 대부분의 경우 인쇄 시 fill 모드를 사용하면 포맷 요소가 숫자를 왼쪽에 선행 0이나 공백으로 패딩하고 텍스트를 오른쪽에 공백으로 패딩해 고정 폭 출력을 보장합니다. 이렇게 하면 고정 폭 폰트의 컬럼 출력이 정렬될 수 있어요.

compact 모드에서는 대부분의 포맷 요소가 최소 폭 출력만 생성해요(즉, 선행 0·공백과 후행 공백이 제거됩니다). 이 규칙을 따르지 않는 포맷 요소는 아래에 명시적으로 표기돼요.

정확 일치 수정자 FX는 인쇄에는 영향을 주지 않으며, 밑줄 포맷 요소는 아무것도 인쇄하지 않아요.

수정자를 사용한 입력 문자열 파싱

입력 문자열 파싱은 채움 모드 수정자 FM과 정확 일치 수정자 FX 모두의 영향을 받아요. 처음에는:

  • 채움 모드는 fill로 설정되고 FMcompact로, 다시 토글.
  • 정확 일치 모드는 lax로 설정되고 FXexact로, 다시 토글.

파싱 중 포맷 요소 및 리터럴에 대한 모든 문자열 매칭은 대소문자를 구분하지 않아요. lax 모드에서 입력 파싱의 첫 단계는 선행 공백(공백, 탭, LF, CR, FF, VT 문자들의 시퀀스)을 건너뛰는 것이며, 첫 포맷 요소가 FX면 처음부터 strict, 그렇지 않으면 lax 모드로 시작합니다.

참고: 파싱되는 값 안에는 일반 공백 문자만 허용돼요(즉, 구성 요소가 서로 다른 줄에 있거나 탭으로 구분될 수 없어요).

lax 매칭 모드에서는 리터럴 안의 공백이 입력의 비어 있지 않은 공백 시퀀스와 매칭되고, 공백이 아닌 문자는 일대일로 매칭돼요. exact 모드에서는 리터럴의 모든 문자가 입력 문자와 일대일로 매칭되어야 합니다.

숫자 포맷 요소는 해당 숫자 시퀀스와 매칭됩니다.

  • fill과 exact 모드가 모두 적용되면, 자릿수는 해당 숫자 포맷 요소의 폭과 정확히 일치해야 해요(선행 0이 기대됩니다).
  • compact 또는 lax 모드가 적용되면, 매칭되는 입력 숫자는 최대 포맷 요소 폭 이하의 자릿수여야 하고 최소 1자리 이상이어야 하며 선행 0은 무시돼요.

텍스트 포맷 요소는 대소문자를 구분하지 않고 매칭됩니다.

  • fill과 exact 모드가 모두 적용되면, 요소의 최대 폭까지의 후행 공백 수가 기대됩니다.
  • 그 외에는, 가변 길이 텍스트 요소 뒤의 공백은 lax 모드에서는 무시되고, exact 모드에서는 실제 단어에 대한 정확 일치(패딩 공백 없이)가 기대됩니다.

마지막으로, 현재 모드가 lax이면 입력 문자열 끝까지의 후행 공백은 무시됩니다. 일반적으로 lax와 exact 모드 모두, 포맷 모델에 공백이 없거나 fill 모드에서 포맷 요소의 내용을 인쇄해도 공백이 생성될 수 없는 곳에서는 매칭 공백을 허용하지 않아요.

참고: 이 동작은 임의의 두 포맷 요소 사이에 공백을 삽입할 수 있는 Oracle lax 매칭 의미론과 다릅니다. Snowflake는 자동 데이터 타입 인식 중 과도한 거짓 매칭을 피하기 위해 더 엄격한 매칭 의미론을 사용해요.

lax와 exact 모드 모두에서 공백이 있으면 무시해야 하는 위치는 _(밑줄) 포맷 요소로 명시적으로 표시할 수 있어요. 경험상, exact 모드의 포맷은 같은 포맷이 인쇄한 입력 문자열만 인식하고, lax 모드의 포맷은 채움 모드 수정자가 추가되거나 제거된 유사한 포맷이 인쇄한 입력 문자열을 인식합니다.

숫자 포맷 모델 (Numeric format models)

숫자 포맷 모델은 두 가지 유형을 지원해요.

  • 고정 위치(fixed-position): 0, 9, X 포맷 요소가 배치된 곳에 자릿수를 명시적으로 배치.
  • 텍스트 최소(text-minimal): TM, TME, TM9 포맷 요소.

참고: 이 두 유형은 같은 모델 안에서 섞을 수 없어요.

고정 위치 숫자 포맷 (Fixed-position numeric formats)

참고: 이 절은 음이 아닌 고정 위치 숫자에 대해 다룹니다. 출력에서 숫자 부호의 위치에 대한 자세한 내용은 고정 위치 포맷의 부호 위치 문서를 참고하세요.

고정 위치 숫자는 숫자 요소 0 또는 9로 표현됩니다. 예를 들어 999는 1~3자리 십진수를 담아요. 숫자의 소수부는 구분자 요소 .(마침표) 또는 D로 구분됩니다.

  • .는 항상 마침표로 렌더링돼요.
  • D 요소에 다른 문자를 쓰려면, 캐스트 함수를 적용하기 전에 입력 문자열의 모든 마침표를 쉼표로, 모든 쉼표를 마침표로 바꿔야 해요.

일반적으로 정수부의 선행 0과 소수부의 후행 0은 공백으로 대체됩니다(정수부 값이 0인 경우는 예외로, 단일 0 문자로 렌더링). 이 동작을 억제하려면 9 대신 0 포맷 요소를 사용하세요. 해당 위치의 0 문자가 보존됩니다. 숫자 앞에 쓰는 포맷 요소 B는 정수 값의 마지막 0 보존을 억제해요(즉, B를 사용하고 숫자의 정수부 값이 0이면 모든 자릿수가 공백으로 렌더링).

숫자 그룹 구분자 ,(쉼표) 또는 G는 숫자가 그룹 구분자 양쪽에 자릿수가 있을 만큼 클 때 해당 그룹 구분자 문자를 인쇄해요. 통화 합계를 인쇄하는 데 유용한 포맷 모델의 예는 999,999.00이에요.

숫자의 정수부에 포맷의 숫자 위치보다 더 많은 자릿수가 있으면 모든 자릿수가 #으로 인쇄되어 오버플로우를 나타냅니다. 지수 요소(exponent element)는 고정 위치 숫자가 정규화되어 정수부의 첫 자릿수가 1~9가 되게 해요(숫자 값이 0이면 지수 값도 0). EE 요소는 지수의 자릿수를 자동으로 적절히 고르고 + 부호를 인쇄하지 않지만, EEE, EEEE, EEEEE는 지수에 + 또는 - 부호와 요청한 자릿수를 항상 인쇄해요(선행 0은 억제되지 않음). 지수 오버플로우는 자릿수 대신 #으로 표시됩니다. 지수 표시기는 포맷 요소의 첫 글자 대소문자에 따라 대문자 E 또는 소문자 e를 인쇄해요.

X 포맷 요소는 9처럼 동작하지만 16진수 자릿수 0-9A-F를 인쇄해요. 현재 16진수 소수는 지원되지 않습니다. 9와 마찬가지로 X는 선행 0을 공백으로 바꿔요. 0 요소는 X와 함께 쓰면 선행 0 억제 없이 16진수 자릿수를 인쇄합니다(따라서 항상 4자리를 포함하는 16진수를 인쇄하려면 000X를 사용). X는 대문자 라틴 문자로 16진수를 인쇄하고, 소문자 x는 소문자 라틴 문자를 인쇄해요. 16진수 0 포맷 요소는 뒤에 오는 X 포맷 요소의 대소문자를 따릅니다.

일반적으로 16진수는 부호 없는 값으로 인쇄됩니다. 즉 음수는 최상위 비트에 모두 1을 갖지만, X 요소를 명시적 부호(S 또는 MI)와 함께 사용하면 숫자의 절대값과 함께 - 부호가 인쇄돼요. 고정 위치 숫자 포맷 모델은 부동 소수점의 특수 값(무한대 또는 NaN)에 대해 오버플로우를 보고해요.

고정 위치 포맷 요소

고정 위치 포맷에서 지원되는 요소는 다음과 같습니다. Repeatable 컬럼은 요소가 포맷 모델에서 반복될 수 있는지(그렇지 않으면 포맷 모델당 한 번만 사용 가능)를 나타내고, Case-sensitive 컬럼은 요소의 대소문자가 포맷에 영향을 주는지 나타냅니다.

요소 반복 가능 대소문자 구분 설명
$ 숫자의 자릿수 앞(보통 부호 뒤)에 달러 기호 인쇄.
% 백분율; 포맷하기 전에 값에 100을 곱하고 입력 포맷의 요소 위치에 리터럴 % 기호가 추가됨. 예: TO_CHAR(0.25, 'TM9%')25%를 생성.
. (마침표) 소수 구분자; 항상 마침표로 인쇄.
, (쉼표) 자릿수 그룹 구분자; 쉼표 또는 공백으로 인쇄.
0 자릿수 위치; 선행/후행 0이 명시적으로 인쇄.
9 자릿수 위치; 선행/후행 0이 공백으로 대체.
B 뒤에 오는 숫자에서 0 값을 공백으로 표현하도록 강제.
D 소수 구분자; . 요소의 대안.
EE 가변 폭 지수, 2~7자, 정수에 + 부호 없음(예: E0, E21, E200, E-200).
EEE 고정 폭 지수(3자); 범위 E-9 ~ E+9.
EEEE 고정 폭 지수(4자); 범위 E-99 ~ E+99.
EEEEE 고정 폭 지수(5자); 범위 E-999 ~ E+999.
EEEEEE 고정 폭 지수(6자); 범위 E-9999 ~ E+9999.
EEEEEEE 고정 폭 지수(7자); 범위 E-16383 ~ E+16384.
G 자릿수 그룹 구분자; ,의 대안.
MI 명시적 숫자 부호 자리 표시자; 양수는 공백, 음수는 - 부호 인쇄.
S 명시적 숫자 부호 자리 표시자; 양수는 +, 음수는 - 부호 인쇄.
X 16진수 자릿수.

고정 위치 포맷의 부호 위치 (Sign position for fixed-position formats)

기본적으로 고정 위치 포맷은 항상 숫자 부호를 위해 공간을 예약해요.

  • 음이 아닌 숫자: 첫 자릿수 앞에 기본 공백이 인쇄.
  • 음수: 첫 자릿수(소수 숫자에 B 포맷 요소를 쓸 때는 소수점) 앞에 기본 공백과 - 부호가 인쇄.

하지만 S, MI, $ 포맷 요소로 숫자의 부호 및/또는 공백 위치를 명시적으로 지정할 수 있어요. 예(밑줄 _은 공백이 삽입되는 위치를 나타냄):

포맷 모델 12가 인쇄되는 값 -7이 인쇄되는 값
99 12_ _-7
S99 +12 _-7
99S 12+ _7-
MI99 _12 -_7
99MI 12_ _7-
$99 _$12 _-$7

고정 위치 포맷과 채움 모드 수정자로 숫자 인쇄

fill 모드에서는 EE, MI 같은 가변 길이 포맷 요소가 오른쪽에 공백으로 패딩돼요. compact 모드에서는 가변 길이 요소를 포함한 숫자 포맷 요소에서 생기는 모든 공백이 제거되어 결과 문자열이 더 짧아지고 더 이상 정렬되지 않습니다. 예:

포맷 모델 12가 인쇄되는 값 -7이 인쇄되는 값
FM99 12 -7

고정 위치 포맷과 수정자로 숫자 파싱

숫자가 포함된 문자열 파싱은 FXFM 수정자 모두의 영향을 받아요.

  • lax 모드에서:
    • 자릿수 그룹 구분자는 선택적(즉, 그룹 구분자가 있든 없든 숫자가 매칭되지만, 각 그룹 구분자 사이의 자릿수는 일치해야 함); 또한 +MI 포맷 요소의 유효한 매칭으로 허용됨.
    • lax 모드는 0 포맷 요소를 매칭하려면 자릿수(선행·후행 0 포함)가 존재해야 한다는 요구를 비활성화하지 않아요.
    • lax 모드에서는 선행 부호와 첫 자릿수 사이의 공백이 허용됨.
    • 또한 lax 모드에서는 모든 지수 포맷 요소(EE, EEE, EEEE, EEEEE)가 EE로 취급되어 1~3자리와 선택적 +/- 부호가 있는 지수 사양과 매칭함.
    • B를 사용해 정수부에 자릿수가 없는 숫자를 매칭할 수 있음. 빈 소수부 앞의 소수점은 lax 모드에서 선택적.
  • exact 모드에서:
    • 숫자는 생략된 자릿수 자리에 적절한 수의 공백이 있어 포맷과 매칭되어야 함(즉, fill 모드에서는 공백, compact 모드에서는 공백 부재).
    • exact 모드에서는 그룹 구분자 생략이 허용되지 않고, MI+ 부호와 매칭되지 않음.
    • EE를 제외한 지수 포맷 요소는 부호 위치와 포맷 요소가 요구하는 정확한 자릿수와 일치해야 함.
    • 포맷 모델이 지정한 위치의 소수점은 필수.

텍스트 최소 숫자 포맷 (Text-minimal numeric formats)

고정 위치 숫자 포맷 모델이 항상 자릿수를 명시적으로 지정하는 반면, 텍스트 최소 포맷 요소는 숫자 값에 기반한 최소 자릿수를 사용해요. TM* 포맷 요소는 채움 모드 수정자(fill 또는 compact)와 무관하게 항상 공백 없는 가변 길이 출력을 생성합니다.

  • TM9는 숫자 값을 정수 또는 소수 분수로 인쇄해요. 고정 소수점 숫자 값은 숫자 스케일에 따라 결정되는 소수부 자릿수로 정확히 인쇄됩니다(fill 모드에서는 후행 0 보존).
  • 부동 소수점 숫자의 경우 TM9는 숫자의 지수에 따라 소수 자릿수를 선택해요(정확한 이진-십진 분수 변환은 불가능함). 부동 소수점 숫자의 크기가 너무 커서 위치 표기(positional notation)가 너무 길어지면 과학적 표기로 전환됩니다(아래 TME 참고). 부동 소수점 숫자가 너무 작으면 TM9는 0을 인쇄해요.
  • TME는 숫자를 과학적 표기(즉, EE와 같은 지수와 소수부의 정수 위치에 한 자릿수)로 인쇄해요. 지수 표시기(E 또는 e)의 대소문자는 포맷 요소의 첫 글자(T 또는 t)의 대소문자와 일치합니다.
  • TM은 숫자의 크기에 따라 TM9 또는 TME 중 하나를 선택해 정밀도를 보존하면서 텍스트 길이를 최소화해요.

TM9는 다음 구문의 파라미터를 지원합니다.

TM9(<number_of_decimal_digits>,<group_size>)
  • number_of_decimal_digits: 최대 자릿수. 자릿수를 제한하려면 정수를, 무제한 자릿수는 ALL을 지정.
  • group_size: 한 그룹의 자릿수.

예를 들어 다음 TM9 포맷은 최대 6자리 소수 자릿수와 3자리씩 그룹화된 정수부를 가진 숫자를 생성해요.

TM9(6,3)

다음 TM9 포맷은 무제한 자릿수와 3자리씩 그룹화된 정수부를 가진 숫자를 생성해요.

TM9(ALL,3)

참고: 현재 파라미터 사양에는 공백이 허용되지 않아요. 예를 들어 TM9(6,3)은 허용되지만 TM9( 6, 3 )이나 TM9(6, 3)은 오류를 반환합니다.

텍스트 최소 포맷 요소

텍스트 최소 포맷에서 지원되는 요소는 다음과 같습니다. 텍스트 최소 포맷 문자열 내에서는 어떤 요소도 반복할 수 없어요.

요소 반복 가능 대소문자 구분 설명
$ 숫자의 자릿수 앞(보통 부호 뒤)에 달러 기호 삽입.
TM 텍스트 최소 숫자, TM9 또는 TME 중 더 짧은 것.
TM9 위치 표기의 텍스트 최소 숫자.
TME 과학적 표기(지수 포함)의 텍스트 최소 숫자.
B 뒤에 오는 숫자에서 0 값을 공백으로 표현하도록 강제.
MI 명시적 숫자 부호 자리 표시자; - 또는 공백이 됨.
S 명시적 숫자 부호 자리 표시자; - 또는 +가 됨.

텍스트 최소 포맷의 부호 위치

기본적으로 텍스트 최소 포맷의 부호는 다음과 같습니다.

  • 음수: 숫자 앞에 붙음(-).
  • 음이 아닌 숫자: 생략됨.

$, S, MI 요소는 고정 위치 포맷 모델과 같은 효과를 가져요. 부동 소수점 숫자에는 각각 무한히 작은 양수와 음수 값을 나타내는 두 개의 서로 다른 0 값(+0.-0.)이 있다는 점을 유의하세요.

텍스트 최소 포맷과 수정자로 숫자 파싱

텍스트 최소 포맷 모델을 사용한 파싱은 FX 또는 FM 수정자의 영향을 받지 않지만, 명시적 부호 요소 SMI는 위에서 설명한 것처럼 영향을 받아요. TM9는 위치 표기의 십진수(정수 또는 소수)와 매칭되지만 과학적 표기(즉, 지수 포함)의 숫자와는 매칭되지 않아요. 반대로:

  • TME는 과학적 표기와만 매칭.
  • TM은 둘 다 매칭.

텍스트 최소 요소가 매칭하는 숫자에는 공백이나 자릿수 그룹 구분자가 있을 수 없어요. 지수 요소와 16진수 자릿수 안의 문자는 항상 대소문자(대문자 또는 소문자)와 무관하게 매칭돼요.

대안·자동·기본 포맷 (Alternate, automatic, and default formats)

요소 설명
` ` (파이프)
AUTO 자동 포맷(들).

문자열을 파싱할 때 포맷 문자열을 | 문자로 구분해 여러 대안 포맷을 지정할 수 있어요. 문자열이 어느 하나의 포맷과 매칭되면 성공적으로 파싱됩니다. 입력 문자열이 여러 포맷과 매칭되면 그 중 아무 포맷이나 변환에 사용됩니다.

파싱에 사용되는 전체 포맷은 AUTO 키워드로 대체할 수 있어요. 이는 소스 또는 결과 값의 유형에 따라 하나 이상의 대안 자동 포맷을 삽입해요. 자동 포맷에 사용자 정의 포맷을 추가하려면 AUTO를 대안 중 하나로 사용하면 됩니다.

기본 포맷(default formats)은 캐스트 함수에서 포맷이 명시적으로 지정되지 않았을 때, 입력 값 파싱(즉, CSV 파일에서), 결과 인쇄에 사용돼요.

인쇄용 기본 포맷

SQL 데이터 타입 파라미터 기본 포맷
DECIMAL 없음 TM9
DOUBLE 없음 TME

파싱용 기본 포맷

SQL 데이터 타입 파라미터 기본 AUTO 포맷
DECIMAL 없음 TM9
DOUBLE 없음 TME

자동 낙관적 문자열 변환(즉, 자동으로 숫자로 인식되는 문자열)에 사용되는 포맷 목록은 위 기본 입력 포맷 표의 모든 포맷의 합집합이에요.

예제 (Examples)

출력 예제

선행 0으로 숫자 표시하기:

create table sample_numbers (f float);
insert into sample_numbers (f) values (1.2);
insert into sample_numbers (f) values (123.456);
insert into sample_numbers (f) values (1234.56);
insert into sample_numbers (f) values (-123456.789);
select to_varchar(f, '999,999.999'), to_varchar(f, 'S000,000.000') from sample_numbers;

출력은 다음과 유사해요.

+------------------------------+-------------------------------+
| TO_VARCHAR(F, '999,999.999') | TO_VARCHAR(F, 'S000,000.000') |
+==============================+===============================+
|        1.2                   | +000,001.200                  |
+------------------------------+-------------------------------+
|      123.456                 | +000,123.456                  |
+------------------------------+-------------------------------+
|    1,234.56                  | +001,234.560                  |
+------------------------------+-------------------------------+
| -123,456.789                 | -123,456.789                  |
+------------------------------+-------------------------------+

숫자 정렬을 위해 선행 0이 필요하진 않아요. 기본 채움 모드는 "fill"이며, 이는 소수점 위치에 기반해 숫자를 정렬하는 데 선행 공백을 사용한다는 뜻이에요.

FM(Fill Mode) 수정자로 "fill" 모드에서 "compact" 모드로 전환하면 숫자를 정렬하던 선행 문자들이 제거돼요.

지수 표기로 숫자 표시하기:

select to_char(1234, '9d999EE'), 'will look like', '1.234E3';

출력:

+--------------------------+------------------+-----------+
| TO_CHAR(1234, '9D999EE') | 'WILL LOOK LIKE' | '1.234E3' |
+==========================+==================+===========+
| 1.234E3                  |  will look like  |  1.234E3  |
+--------------------------+------------------+-----------+

출력에 리터럴 포함하기. 리터럴 부분은 문자열을 구분하는 작은따옴표 안에 있는 큰따옴표로 둘러싸입니다.

select to_char(12, '">"99"<"');

출력:

+-------+
| > 12< |
+-------+

입력 예제

"0"과 "9"로 자릿수 포맷을 지정하는 것의 차이를 보여주는 간단한 입력 작업 예시예요. 포맷터로 사용되는 숫자 9는 공백이나 "누락된" 선행 자릿수를 받아들이지만, 숫자 0은 공백이나 누락된 선행 0을 받아들이지 않아요.

-- 다음 모두 입력을 숫자 12,345.67로 변환한다.
SELECT TO_NUMBER('012,345.67', '999,999.99', 8, 2);
SELECT TO_NUMBER('12,345.67', '999,999.99', 8, 2);
SELECT TO_NUMBER(' 12,345.67', '999,999.99', 8, 2);
-- 다음 중 첫 번째는 동작하지만 나머지는 변환되지 않는다.
-- (변환되지 않는 것이 맞으므로 "실패"가 정상이다.)
SELECT TO_NUMBER('012,345.67', '000,000.00', 8, 2);
SELECT TO_NUMBER('12,345.67', '000,000.00', 8, 2);
SELECT TO_NUMBER(' 12,345.67', '000,000.00', 8, 2);

두 숫자 포맷 중 하나(-### 또는 ###-)를 받아들이는 예는 다음과 같아요.

-- 테이블을 만들고 데이터를 삽입한다.
create table format1 (v varchar, i integer);
insert into format1 (v) values ('-101');
insert into format1 (v) values ('102-');
insert into format1 (v) values ('103');

-- 포맷 모델 없이 varchar를 integer로 변환하려 한다.
-- 이것은 다음과 유사한 메시지로 실패한다(예상대로).
--    "Numeric value '102-' is not recognized"
update format1 set i = TO_NUMBER(v);

-- 이제 마이너스 부호가 숫자의 시작 또는 끝에 올 수 있게 하는
-- 포맷 지정자로 다시 시도한다.
-- 어느 포맷이든 허용됨을 나타내는 세로 막대("|") 사용에 주목하라.
update format1 set i = TO_NUMBER(v, 'MI999|999MI');
select i from format1;

더 알아보기 (Learn more)