Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 VARCHAR(문자열) 컬럼을 숫자처럼 정렬하는 방법

MySQL에서 숫자 값이 VARCHAR 타입으로 저장되어 있으면, 단순히 ORDER BY를 사용할 때 사전식(문자열) 순서로 정렬됩니다. 이 경우 컬럼명 뒤에 +0을 붙여주면 값을 숫자로 변환해 올바르게 정렬할 수 있습니다.

기본 문법

SELECT yourColumnName FROM yourTableName ORDER BY yourColumnName + 0 DESC;

위 문법이 실제로 어떻게 동작하는지 예제를 통해 살펴보겠습니다.

테스트 테이블 생성하기

먼저 테이블을 생성하는 쿼리입니다.

mysql> create table selectOrderdemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Name varchar(100),
    -> RankNumber varchar(100)
    -> );
Query OK, 0 rows affected (0.55 sec)

데이터 삽입하기

INSERT 명령으로 몇 개의 레코드를 추가합니다.

mysql> insert into selectOrderdemo(Name,RankNumber) values('Larry',-100);
Query OK, 1 row affected (0.23 sec)
mysql> insert into selectOrderdemo(Name,RankNumber) values('John',50);
Query OK, 1 row affected (0.13 sec)
mysql> insert into selectOrderdemo(Name,RankNumber) values('Bob',0);
Query OK, 1 row affected (0.14 sec)
mysql> insert into selectOrderdemo(Name,RankNumber) values('Carol',-110);
Query OK, 1 row affected (0.23 sec)
mysql> insert into selectOrderdemo(Name,RankNumber) values('David',98);
Query OK, 1 row affected (0.21 sec)

저장된 데이터 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select * from selectOrderdemo;

실행 결과는 다음과 같습니다.

+----+-------+------------+
| Id | Name  | RankNumber |
+----+-------+------------+
| 1  | Larry | -100       |
| 2  | John  | 50         |
| 3  | Bob   | 0          |
| 4  | Carol | -110       |
| 5  | David | 98         |
+----+-------+------------+
5 rows in set (0.00 sec)

RankNumber는 VARCHAR 타입이므로, 일반적인 ORDER BY만 사용하면 문자열 기준으로 정렬됩니다. 아래에서 +0을 활용해 숫자처럼 정렬하는 방법을 케이스별로 확인해 보겠습니다.

숫자처럼 정렬하는 쿼리

케이스 1: 내림차순 정렬

결과를 큰 수부터 작은 수 순으로 정렬하려면 다음 쿼리를 사용합니다.

mysql> select RankNumber FROM selectOrderdemo ORDER BY RankNumber+0 DESC;

실행 결과입니다.

+------------+
| RankNumber |
+------------+
| 98         |
| 50         |
| 0          |
| -100       |
| -110       |
+------------+
5 rows in set (0.00 sec)

케이스 2: 오름차순 정렬

결과를 작은 수부터 큰 수 순으로 정렬하려면 다음 쿼리를 사용합니다.

mysql> select RankNumber FROM selectOrderdemo ORDER BY RankNumber+0;

실행 결과입니다.

+------------+
| RankNumber |
+------------+
| -110       |
| -100       |
| 0          |
| 50         |
| 98         |
+------------+
5 rows in set (0.00 sec)

케이스 3: 전체 컬럼 조회 및 정렬

테이블의 모든 컬럼을 숫자 순서대로 정렬해서 가져오려면 아래 쿼리를 사용합니다.

mysql> select * FROM selectOrderdemo ORDER BY RankNumber+0 DESC;

실행 결과입니다.

+----+-------+------------+
| Id | Name  | RankNumber |
+----+-------+------------+
| 5  | David | 98         |
| 2  | John  | 50         |
| 3  | Bob   | 0          |
| 1  | Larry | -100       |
| 4  | Carol | -110       |
+----+-------+------------+
5 rows in set (0.00 sec)

정리

VARCHAR 타입 컬럼에 저장된 숫자를 정렬할 때는 ORDER BY 컬럼명 + 0처럼 +0을 붙이면 MySQL이 해당 값을 암시적으로 숫자로 변환하여 올바른 숫자 순서대로 정렬해 줍니다. 다만 이런 방식은 인덱스를 활용하지 못해 대용량 테이블에서 성능 저하가 발생할 수 있으므로, 가능하다면 처음부터 숫자 타입(INT, DECIMAL 등)으로 컬럼을 설계하는 것이 좋습니다.