모든 수치형 데이터 타입을 산술 연산에 사용할 수 있으며, 연산 결과 타입은 피연산자의 데이터 타입과 연산의 종류에 따라 다르다. 아래는 피연산자 타입별 덧셈/뺄셈/곱셈 연산의 결과 데이터 타입을 정리한 표이다.
피연산자의 타입별 결과 데이터 타입
|
INT |
NUMERIC |
FLOAT |
DOUBLE |
MONETARY |
---|---|---|---|---|---|
INT |
INT |
NUMERIC |
FLOAT |
DOUBLE |
MONETARY |
NUMERIC |
NUMERIC |
NUMERIC |
DOUBLE |
DOUBLE |
MONETARY |
FLOAT |
FLOAT |
DOUBLE |
FLOAT |
DOUBLE |
MONETARY |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
DOUBLE |
MONETARY |
MONETARY |
MONETARY |
MONETARY |
MONETARY |
MONETARY |
MONETARY |
피연산자가 모두 동일한 데이터 타입이면 연산 결과의 타입이 변환되지 않으나, 나누기 연산의 경우 예외적으로 타입이 변환되므로 주의해야 한다. 분모, 즉 제수(divisor)가 0이면 에러가 발생한다.
피연산자 중 하나가 MONETARY 타입인 경우, DOUBLE 타입과 같은 연산 방식을 채택하고 있으므로 연산 결과는 모두 MONETARY 타입으로 반환된다.
아래는 피연산자가 모두 NUMERIC 타입인 경우, 연산 결과의 전체 자릿수(p)와 소수점 아래 자릿수(s)를 정리한 표이다.
NUMERIC 타입의 연산 결과
연산 |
결과의 최대 자릿수 |
결과의 소수점 이하 자릿수 |
---|---|---|
N(p1, s1) + N(p2, s2) |
max(p1-s1, p2-s2)+max(s1, s2) +1 |
max(s1, s2) |
N(p1, s1) - N(p2, s2) |
max(p1-s1, p2-s2)+max(s1, s2) |
max(s1, s2) |
N(p1, s1) * N(p2, s2) |
p1+p2+1 |
s1+s2 |
N(p1, s1) / N(p2, s2) |
s2 > 0 이면 Pt = p1+max(s1, s2) + s2 - s1, 그 외에는 Pt = p1라 하고, s1 > s2 이면 St = s1, 그 외에는 s2라 하면, 소수점 이하 자릿수는 St < 9 이면 min(9-St, 38-Pt) + St, 그 외에는 St |
--int * int
SELECT 123*123;
=============
15129
-- int * int returns overflow error
SELECT (1234567890123*1234567890123);
-- int * numeric returns numeric type
SELECT (1234567890123*CAST(1234567890123 AS NUMERIC(15,2)));
======================
1524157875322755800955129.00
-- int * float returns float type
SELECT (1234567890123*CAST(1234567890123 AS FLOAT));
===============================================
1.524158e+024
-- int * double returns double type
SELECT (1234567890123*CAST(1234567890123 AS DOUBLE));
================================================
1.524157875322756e+024
-- numeric * numeric returns numeric type
SELECT (CAST(1234567890123 AS NUMERIC(15,2))*CAST(1234567890123 AS NUMERIC(15,2)));
======================
1524157875322755800955129.0000
-- numeric * float returns double type
SELECT (CAST(1234567890123 AS NUMERIC(15,2))*CAST(1234567890123 AS FLOAT));
=======================================================================
1.524157954716582e+024
-- numeric * double returns double type
SELECT (CAST(1234567890123 AS NUMERIC(15,2))*CAST(1234567890123 AS DOUBLE));
========================================================================
1.524157875322756e+024
-- float * float returns float type
SELECT (CAST(1234567890123 AS FLOAT)*CAST(1234567890123 AS FLOAT));
===============================================================
1.524158e+024
-- float * double returns float type
SELECT (CAST(1234567890123 AS FLOAT)*CAST(1234567890123 AS DOUBLE));
================================================================
1.524157954716582e+024
-- double * double returns float type
SELECT (CAST(1234567890123 AS DOUBLE)*CAST(1234567890123 AS DOUBLE));
=================================================================
1.524157875322756e+024
-- int / int returns int type without type conversion or rounding
SELECT 100100/100000;
===============
1
-- int / int returns int type without type conversion or rounding
SELECT 100100/200200;
===============
0
-- int / zero returns error
SELECT 100100/(100100-100100);
ERROR: Attempt to divide by zero.