티스토리 뷰
안녕하세요, 끙정입니다.
오늘은 데이터 타입 변환 함수에 대해서 알아보겠습니다.
DBMS의 필드나 변수는 저마다 고유의 데이터 타입이 있고 타입에 따라 연산 방식이 달라집니다.
아래 사진은 오라클과 SQL Server에서 각각 똑같은 쿼리를 실행한 결과입니다.
수치는 신경쓰지 말자...
오라클은 모든 수치를 실수로 취급하기 때문에 평균도 실수로 계산합니다.
반면에 SQL Server는 popu가 정수타입이니 평균도 정수까지만 계산합니다.
만일 원하는 결과가 따로 있다면 데이터의 타입을 강제로 바꿔야 합니다.
1. CAST
CAST(필드 AS 타입)
CAST 연산자는 필드(또는 변수)의 타입을 강제 변환합니다.
/* Oracle */
SELECT CAST(AVG(popu) AS INT) FROM tCity;
/* 계산 결과를 INT형으로 변환하여 출력 */
/* SQL Server */
SELECT AVG(CAST(popu AS decimal)) FROM tCity;
/* 정수형 popu를 decimal로 바꿔서 AVG를 계산 */
원칙적으로 연산자의 양변은 같은 타입이어야 자연스럽고 말썽이 없습니다.
그러나 암묵적으로 타입을 바꿔 주는 경우가 많아 강제 변환이 필요한 경우가 그리 많지 않습니다.
'12'는 문자열이고, 34는 수치형입니다.
그런데 숫자끼리 더하는 + 연산자를 통해 '12'를 수치형으로 변환합니다.
반면에 문자열끼리 연결하는 || 연산자는 34를 문자열로 변환합니다.
그러나 SQL Server는 + 연산자로 숫자도 더하고 문자열도 연결하기 때문에 헷갈려할 수 있습니다.
그래서 수치형을 우선으로 하여 덧셈을 수행합니다.
문자열을 의도했다면 형변환을 해주거나 CONCAT 함수를 사용해야 합니다.
SELECT '12' + 34;
SELECT '12' + CAST(34 AS VARCHAR(10));
SELECT CONCAT('12', 34);
2. TO_CHAR, TO_NUMBER, CONVERT
표준 타입 변환 함수인 CAST 외에도 DBMS별로 고유한 타입 변환 함수를 지원합니다.
오라클은 수치와 문자열을 변환할 떄 다음 두 함수를 사용합니다.
TO_CHAR(숫자, 포맷)
TO_NUMBER(포맷, 포맷)
TO_CHAR 함수는 단순히 타입만 바꾸는 것이 아니라 포맷에 따라 출력 형식을 조정합니다.
포맷에는 9와 0으로 숫자 자리를 표기하되 9에 대응되는 자리수가 없으면 공백으로 치환하고 0은 0으로 치환합니다.
공백까지 제거하려면 포맷 선두에 FM을 붙입니다.
SELECT TO_CHAR(12345) FROM dual; /* 12345 */
SELECT TO_CHAR(12345, '999,999') FROM dual; /* 12,345 */
SELECT TO_CHAR(12345, 'FM999,999') FROM dual; /*12,345 */
SELECT TO_CHAR(12345, '000,999') FROM dual; /* 012,345 */
TO_NUMBER는 문자열을 숫자로 바꾸는데, 암묵적 변환이 잘 동작되기 때문에 쓸 일이 많지는 않습니다.
다만 서식이 있는 숫자를 읽을 때는 꼭 필요합니다.
SELECT TO_NUMBER('12,345') FROM dual; /* 에러가 난다. */
SELECT TO_NUMBER('12,345', '999,999') FROM dual;
SQL Server는 CAST외에 CONVERT 함수를 제공합니다.
CAST와 사실상 같은 함수이지만 인수의 순서가 반대로 되어 있고 스타일을 추가로 지정할 수 있다는 차이가 있습니다.
CONVERT(타입, 값, [스타일])
SELECT '응답하라' + CONVERT(VARCHAR(10), 1989);
그러나 CAST 함수가 도입된 이후로는 잘 쓰지 않는 추세입니다.
그만 알아보겠습니다.
출처
http://www.yes24.com/Product/Goods/101637633?OzSrank=1
'SQL' 카테고리의 다른 글
SQL의 데이터 타입에 대해 알아보자 (0) | 2023.02.14 |
---|---|
피봇에 대해 알아보자 (feat. PIVOT, UNPIVOT) (0) | 2023.02.13 |
통계에 대해 알아보자 (feat. NTILE, LAG, LEAD, CUME_DIST) (0) | 2023.02.13 |
순위에 대해 알아보자 (feat. OVER, RANK, ROW_NUMBER) (0) | 2023.02.12 |
함수에 대해 알아보자 3편 (feat. 검색, 변환, 대체) (0) | 2023.02.11 |
- Total
- Today
- Yesterday
- alexa
- Apple
- condenast
- Nvidia
- Intel
- SSI
- Amazon
- perplexity
- sql
- 액침냉각
- galaxyai
- datacenter
- Meta
- genai
- IDC
- ai pc
- apple intelligence
- searchgpt
- OpenAI
- aitv
- Samsung
- ChatGPT
- sb1047
- aichip
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |