MySQL에서 VARCHAR 타입으로 저장된 숫자 데이터를 단순히 ORDER BY로 정렬하면 문자열 기준으로 비교되기 때문에 의도한 숫자 크기순으로 정렬되지 않습니다. 예를 들어 '9.59'가 '124.50'보다 뒤에 위치해야 하지만 문자열 비교에서는 앞에 오는 문제가 발생합니다.
이러한 문제를 해결하려면 CAST() 함수를 사용하여 문자열을 숫자(DECIMAL) 타입으로 변환한 뒤 정렬해야 합니다. 기본 문법은 다음과 같습니다.
SELECT * FROM yourTableName ORDER BY CAST(yourColumnName AS DECIMAL(정수부 자릿수, 소수점 이하 자릿수)) DESC;
예제 테이블 생성하기
먼저 실습용 테이블을 생성합니다. 아래 쿼리를 실행하세요.
mysql> CREATE TABLE SortingStringDemo -> ( -> Amount varchar(10) -> ); Query OK, 0 rows affected (0.91 sec)
샘플 데이터 삽입하기
INSERT 명령어를 사용하여 몇 개의 레코드를 추가합니다.
mysql> INSERT INTO SortingStringDemo VALUES('12.34');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO SortingStringDemo VALUES('124.50');
Query OK, 1 row affected (0.56 sec)
mysql> INSERT INTO SortingStringDemo VALUES('9.59');
Query OK, 1 row affected (0.20 sec)
mysql> INSERT INTO SortingStringDemo VALUES('150.68');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO SortingStringDemo VALUES('600.54');
Query OK, 1 row affected (0.11 sec)저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> SELECT * FROM SortingStringDemo;
실행 결과는 다음과 같습니다.
+--------+ | Amount | +--------+ | 12.34 | | 124.50 | | 9.59 | | 150.68 | | 600.54 | +--------+ 5 rows in set (0.00 sec)
CAST() 함수로 내림차순 정렬하기
이제 CAST() 함수를 사용하여 Amount 컬럼을 DECIMAL(6,2) 타입으로 변환한 후 내림차순으로 정렬해 보겠습니다.
mysql> SELECT * FROM SortingStringDemo ORDER BY CAST(Amount AS DECIMAL(6,2)) DESC;
실행 결과는 다음과 같습니다.
+--------+ | Amount | +--------+ | 600.54 | | 150.68 | | 124.50 | | 12.34 | | 9.59 | +--------+ 5 rows in set (0.00 sec)
정리
문자열로 저장된 숫자 데이터를 정렬할 때는 반드시 CAST(컬럼명 AS DECIMAL(m,d)) 형태로 변환하여 정렬해야 합니다. 여기서 첫 번째 인수는 전체 유효 자릿수, 두 번째 인수는 소수점 이하 자릿수를 의미합니다. 이 방법을 사용하면 '600.54'부터 '9.59'까지 숫자 크기 기준으로 정확하게 정렬된 결과를 얻을 수 있습니다.