산술 연산자

산술 연산자는 하나 이상의 입력 식에서 숫자 출력을 생성하는 데 사용됩니다.

다음 경우를 제외하고 입력 식은 숫자형(고정 소수점 또는 부동 소수점)이어야 합니다.

  • 단항 연산자 + 는 숫자 문자열을 받을 수 있지만, 이로 인해 문자열이 해당 숫자 값으로 암시적으로 변환됩니다.

  • 이항 연산자 - 는 DATE 식에 적용할 수 있습니다.

이 항목의 내용:

산술 연산자 목록

연산자

구문

설명

+ (단항)

+a

a 를 숫자 값으로 암시적으로 변환하는 a 를 반환합니다. a 가 문자열이지만 그 문자열을 숫자 값으로 변환할 수 없는 경우 오류가 반환됩니다.

+

a + b

두 개의 숫자 식(ab)을 추가합니다.

- (단항)

-a

입력 숫자 식을 부정합니다.

-

a - b

한 숫자 식(a)에서 다른 숫자 식(b)을 뺍니다.

-

a - b

한 날짜 식(a)에서 다른 날짜 식(b)을 뺍니다. 결과는 정수로 표시되는 일수입니다. 빼기는 DATE 식에 허용되는 유일한 산술 연산입니다.

*

a * b

두 개의 숫자 식(ab)을 곱합니다.

/

a / b

한 숫자 식(a)을 다른 숫자 식(b)으로 나눕니다. 0 또는 NULL로 나눌 때 0을 반환하는 함수에 대해서는 DIV0DIV0NULL 섹션을 참조하십시오.

%

a % b

숫자 식 a % b 의 모듈로를 계산합니다. MOD 도 참조하십시오.

산술 연산의 소수 자릿수와 전체 자릿수

산술 연산 출력의 소수 자릿수전체 자릿수 는 입력값의 소수 자릿수와 전체 자릿수에 따라 달라집니다.

이 섹션에서는 Snowflake가 다양한 산술 연산(곱하기, 나누기 등)에서 생성된 숫자 출력값의 소수 자릿수와 전체 자릿수를 유지하기 위해 사용하는 계산에 대해 설명합니다. 이 섹션에서는 다음 설명이 사용됩니다.

선행 자릿수

숫자 값에서 소수점 왼쪽의 자릿수(L)입니다.

소수 자릿수

숫자 값에서 소수점 오른쪽의 자릿수(S)입니다.

전체 자릿수

숫자 값의 전체 자릿수(P)로, 선행 자릿수와 소수 자릿수(즉, P = L + S)의 합으로 계산됩니다. Snowflake의 전체 자릿수는 항상 38로 제한됩니다.

또한, 다음 사항에 유의하십시오.

  • 고정 소수점 데이터 타입(NUMBER, DECIMAL 등)은 전체 자릿수와 소수 자릿수를 활용합니다. 예를 들어, DECIMAL(8,2) 데이터 타입의 경우 전체 자릿수는 8, 소수 자릿수는 2, 선행 자릿수는 6입니다.

  • 부동 소수점 데이터 타입(FLOAT, DOUBLE, REAL 등)은 8바이트 double형을 사용합니다.

출력값의 경우 이들은 최대 자릿수이고, 주어진 출력값의 실제 자릿수는 더 적을 수 있습니다.

곱하기

곱하기를 수행할 때는 다음과 같습니다.

  • 출력값에서 선행 자릿수의 개수는 두 입력값에서 선행 자릿수의 합입니다.

  • Snowflake는 두 입력값 중 하나의 소수 자릿수가 12보다 크지 않은 경우(12보다 큰 입력 소수 자릿수가 출력 소수 자릿수로 사용됨), 두 입력값의 소수 자릿수 개수를 더해 (연쇄적인 곱셈으로 인한) 잠재적 오버플로를 최소화합니다.

즉, 두 개의 입력값(L1.S1L2.S2)을 사용한 곱하기 연산을 가정할 때, 출력값의 최대 자릿수는 다음과 같이 계산됩니다.

선행 자릿수

L = L1 + L2

소수 자릿수

S = min(S1 + S2, max(S1, S2, 12))

전체 자릿수

P = L + S

참고

Snowflake는 숫자 값에 대해 정수 곱셈을 수행하므로 중간 결과에서 일부 오버플로가 발생할 수 있지만, 최종 출력값은 오버플로되지 않습니다.

select 10.01 n1, 1.1 n2, n1 * n2;

+-------+-----+---------+
|    N1 |  N2 | N1 * N2 |
|-------+-----+---------|
| 10.01 | 1.1 |  11.011 |
+-------+-----+---------+

select 10.001 n1, .001 n2, n1 * n2;

+--------+-------+----------+
|     I1 |    I2 |  I1 * I2 |
|--------+-------+----------|
| 10.001 | 0.001 | 0.010001 |
+--------+-------+----------+

select .1 n1, .0000000000001 n2, n1 * n2;

+-----+-----------------+-----------------+
|  N1 |              N2 |         N1 * N2 |
|-----+-----------------+-----------------|
| 0.1 | 0.0000000000001 | 0.0000000000000 |
+-----+-----------------+-----------------+
Copy

나누기

나누기를 수행할 때는 다음과 같습니다.

  • 출력값의 선행 자릿수는 분자의 선행 자릿수와 분모의 소수 자릿수의 합입니다.

  • Snowflake는 분자의 소수 자릿수가 12보다 크지 않은 경우(분자 소수 자릿수가 출력 소수 자릿수로 사용됨), 분자의 소수 자릿수에 6자리(최대 임계값은 12개 자릿수)를 더해 (연쇄적인 나눗셈으로 인한) 출력값의 잠재적 오버플로와 소수 자릿수 손실을 최소화합니다.

즉, 분자 L1.S1 과 분모 L2.S2 를 사용한 나누기 연산을 가정할 때, 출력값의 최대 자릿수는 다음과 같이 계산됩니다.

선행 자릿수

L = L1 + S2

소수 자릿수

S = max(S1, min(S1 + 6, 12))

전체 자릿수

P = L + S

나누기 연산의 결과가 출력 소수 자릿수를 초과할 경우 Snowflake는 출력값을 자르지 않고 반올림합니다.

참고

곱하기와 유사하게, 나누기의 중간 결과에서 일부 오버플로가 발생할 수 있지만, 최종 출력값은 오버플로되지 않습니다.

select 2 n1, 7 n2, n1 / n2;

+----+----+----------+
| N1 | N2 |  N1 / N2 |
|----+----+----------|
|  2 |  7 | 0.285714 |
+----+----+----------+

select 10.1 n1, 2.1 n2, n1 / n2;

+------+-----+-----------+
|   N1 |  N2 |   N1 / N2 |
|------+-----+-----------|
| 10.1 | 2.1 | 4.8095238 |
+------+-----+-----------+

select 10.001 n1, .001 n2, n1 / n2;

+--------+-------+-----------------+
|     N1 |    N2 |         N1 / N2 |
|--------+-------+-----------------|
| 10.001 | 0.001 | 10001.000000000 |
+--------+-------+-----------------+

select .1 n1, .0000000000001 n2, n1 / n2;

+-----+-----------------+-----------------------+
|  N1 |              N2 |               N1 / N2 |
|-----+-----------------+-----------------------|
| 0.1 | 0.0000000000001 | 1000000000000.0000000 |
+-----+-----------------+-----------------------+
Copy

더하기와 빼기

더하기 또는 빼기의 경우:

  • 출력값의 선행 자릿수는 입력값의 선행 자릿수 중 가장 큰 수에 (전달된 값을 유지하기 위해) 1을 더한 값입니다.

  • 출력값의 소수 자릿수는 입력값의 가장 큰 소수 자릿수입니다.

즉, 더하기 또는 빼기 연산에 두 개의 입력값(L1.S1L2.S2)이 있다고 가정할 때, 출력값의 최대 자릿수는 다음과 같이 계산됩니다.

선행 자릿수

L = max(L1, L2) + 1

소수 자릿수

S = max(S1, S2)

전체 자릿수

P = L + S

기타 무한급수 연산

모듈로(a % b 또는 MOD)와 같이 둘 이상의 숫자 입력값을 사용하는 다른 모든 산술 연산의 경우:

  • 출력값의 선행 자릿수는 입력값의 선행 자릿수 중 가장 큰 수입니다.

  • 출력값의 소수 자릿수는 입력값의 가장 큰 소수 자릿수입니다.

즉, 입력값 L1.S1L2.S2 를 사용한 무한급수 연산을 가정할 때, 출력값의 최대 자릿수는 다음과 같이 계산됩니다.

선행 자릿수

L = max(L1, L2, ...)

소수 자릿수

S = max(S1, S2, ...)

전체 자릿수

P = L + S

단항 연산

단항 산술 연산에서는 출력 소수 자릿수를 명시적으로 지정할 수 있는 ROUND 를 제외하고, 입력 전체 자릿수 및 소수 자릿수와 같은 출력 전체 자릿수 및 소수 자릿수를 갖습니다.

비트 연산

지원되는 비트 산술 연산의 목록은 조건식 함수 에서 확인할 수 있습니다.

참고:

  • 숫자 값의 경우 비트 연산은 입력값의 선행 자릿수로만 작동합니다. 출력값의 소수 자릿수는 항상 0입니다.

  • 이진 비트 연산의 경우, 출력값은 입력값의 최대 선행 자릿수와 같은 수의 선행 자릿수가 있습니다.