데이터베이스에서 VARCHAR와 같은 문자열 타입으로 저장된 숫자를 정렬할 때, 일반적인 ORDER BY 절은 사전 순(문자열 기준)으로 정렬되기 때문에 의도한 숫자 크기순 결과가 나오지 않습니다. 예를 들어 '3', '20', '90'이 있다면 '90', '20', '3' 순서가 아니라 '20', '3', '90'처럼 정렬될 수 있습니다.
이 문제를 해결하려면 MySQL의 CAST() 함수를 사용해 문자열을 숫자(SIGNED)로 변환한 뒤 정렬하면 됩니다.
기본 문법
SELECT * FROM yourTableName
ORDER BY CAST(yourColumnName AS SIGNED) DESC;
예제 테이블 생성
먼저 예제에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
(
Id varchar(100)
);
Query OK, 0 rows affected (0.18 sec)
데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('3');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable values('20');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable values('34');
Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable values('21');
Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable values('78');
Query OK, 1 row affected (0.04 sec)
mysql> insert into DemoTable values('90');
Query OK, 1 row affected (0.07 sec)저장된 데이터 확인
SELECT 문으로 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 3 |
| 20 |
| 34 |
| 21 |
| 78 |
| 90 |
+------+
6 rows in set (0.00 sec)
CAST()를 이용한 숫자 정렬
이제 CAST() 함수를 적용해 Id 컬럼을 SIGNED(부호 있는 정수)로 변환한 후 내림차순(DESC)으로 정렬하는 쿼리입니다.
mysql> select *from DemoTable ORDER BY CAST(Id AS SIGNED) DESC;
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 90 |
| 78 |
| 34 |
| 21 |
| 20 |
| 3 |
+------+
6 rows in set (0.02 sec)
위 출력 결과를 보면 문자열이 아닌 실제 숫자 값 기준으로 90, 78, 34, 21, 20, 3 순서대로 올바르게 정렬된 것을 확인할 수 있습니다.
추가 팁
- 오름차순 정렬이 필요하면
DESC대신ASC를 사용하세요. - MySQL 8.0 이상에서는
CAST(column AS UNSIGNED)또는column + 0방식도 동일하게 활용할 수 있습니다. - 컬럼에 숫자가 아닌 값이 섞여 있으면 변환 시 0으로 처리되므로, 가능하다면 처음부터 숫자 타입(INT 등)으로 컬럼을 설계하는 것이 좋습니다.