SQL에서 VARCHAR를 DOUBLE로 변환하는 방법
MySQL에서 문자열(VARCHAR)로 저장된 숫자 데이터를 수치 연산이나 정렬에 활용하려면 데이터 타입 변환이 필요합니다. 이때 CAST() 함수를 사용하면 VARCHAR 타입을 DOUBLE(DECIMAL) 타입으로 간단하게 변환할 수 있습니다.
CAST() 함수 기본 문법
SELECT yourColumnName1, yourColumnName2, ......N,
CAST(yourColumnName AS DECIMAL(TotalDigit, DigitAfterDecimalPoint)) anyVariableName
FROM yourTableName
ORDER BY anyVariableName DESC;
- TotalDigit: 전체 자릿수
- DigitAfterDecimalPoint: 소수점 이하 자릿수
위 문법을 실제로 이해하기 위해 예제 테이블을 하나 만들어 보겠습니다.
1. 테이블 생성
다음 쿼리로 테이블을 생성합니다.
mysql> create table VarcharToDouble
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(10),
-> Amount varchar(10),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.67 sec)
여기서 Amount 컬럼은 금액이지만 VARCHAR 타입으로 선언되어 있어, 그대로 두면 숫자 크기순 정렬이나 합계 계산에 문제가 생길 수 있습니다.
2. 샘플 데이터 입력
INSERT 명령어로 몇 개의 레코드를 추가합니다.
mysql> insert into VarcharToDouble(Name,Amount) values('John','456.78');
Query OK, 1 row affected (0.14 sec)
mysql> insert into VarcharToDouble(Name,Amount) values('Larry','8465.98');
Query OK, 1 row affected (0.18 sec)
mysql> insert into VarcharToDouble(Name,Amount) values('Mike','9083.45');
Query OK, 1 row affected (0.12 sec)
mysql> insert into VarcharToDouble(Name,Amount) values('Sam','46475.50');
Query OK, 1 row affected (0.19 sec)
mysql> insert into VarcharToDouble(Name,Amount) values('Carol','10003.35');
Query OK, 1 row affected (0.17 sec)3. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from VarcharToDouble;
실행 결과는 다음과 같습니다.
+----+-------+----------+
| Id | Name | Amount |
+----+-------+----------+
| 1 | John | 456.78 |
| 2 | Larry | 8465.98 |
| 3 | Mike | 9083.45 |
| 4 | Sam | 46475.50 |
| 5 | Carol | 10003.35 |
+----+-------+----------+
5 rows in set (0.00 sec)
4. CAST()로 VARCHAR를 DOUBLE(DECIMAL)로 변환
이제 CAST() 함수를 사용해 Amount 컬럼을 DECIMAL(10,2)로 변환하고, 변환된 값을 기준으로 내림차순 정렬해 보겠습니다.
mysql> select Id, Name, CAST(Amount AS DECIMAL(10,2)) TotalAmount from VarcharToDouble
-> order by TotalAmount desc;
실행 결과는 다음과 같습니다.
+----+-------+-------------+
| Id | Name | TotalAmount |
+----+-------+-------------+
| 4 | Sam | 46475.50 |
| 5 | Carol | 10003.35 |
| 3 | Mike | 9083.45 |
| 2 | Larry | 8465.98 |
| 1 | John | 456.78 |
+----+-------+-------------+
5 rows in set (0.00 sec)
VARCHAR 상태에서는 '9'로 시작하는 값이 '4'보다 앞에 오는 등 문자열 기준 정렬이 되지만, CAST()로 수치형으로 변환하면 실제 숫자 크기 기준으로 올바르게 정렬되는 것을 확인할 수 있습니다.
참고 사항
- DECIMAL vs DOUBLE: 금액처럼 정확한 소수점 계산이 필요한 경우에는 부동소수점 방식인 DOUBLE보다 고정소수점 방식인 DECIMAL을 사용하는 것이 안전합니다.
- MySQL 8.0.17 이상: 최신 버전에서는
CAST(Amount AS DOUBLE)구문도 직접 지원하므로, 환경에 따라 선택적으로 사용할 수 있습니다. - CONVERT() 함수: CAST() 대신
CONVERT(Amount, DECIMAL(10,2))형태로도 동일한 결과를 얻을 수 있습니다.