쉼표로 구분된 숫자 집합을 저장한 컬럼을 첫 번째 숫자를 기준으로 정렬하려면 ORDER BY 절과 SUBSTRING_INDEX() 함수를 함께 사용하면 됩니다. SUBSTRING_INDEX(컬럼명, ',', 1)은 첫 번째 쉼표 앞까지의 문자열을 반환하며, 이를 CAST(... AS UNSIGNED)로 감싸 숫자로 변환한 후 정렬에 활용하는 원리입니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
SetOfNumbers text
);
Query OK, 0 rows affected (0.53 sec)2. 데이터 삽입
INSERT 명령을 사용하여 샘플 레코드를 몇 개 삽입합니다.
mysql> insert into DemoTable values('245,654,76,89,98');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('2000,567,9090,6789');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('1001,90595,657,99');
Query OK, 1 row affected (0.20 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+--------------------+ | SetOfNumbers | +--------------------+ | 245,654,76,89,98 | | 2000,567,9090,6789 | | 1001,90595,657,99 | +--------------------+ 3 rows in set (0.00 sec)
4. 첫 번째 숫자 기준으로 정렬하기
숫자 집합의 첫 번째 숫자를 기준으로 정렬하는 쿼리는 다음과 같습니다.
mysql> select *from DemoTable order by cast(substring_index(SetOfNumbers,',',1) as unsigned);
실행 결과는 아래와 같습니다.
+--------------------+ | SetOfNumbers | +--------------------+ | 245,654,76,89,98 | | 1001,90595,657,99 | | 2000,567,9090,6789 | +--------------------+ 3 rows in set (0.00 sec)
결과를 살펴보면 각 행의 첫 번째 값인 245, 1001, 2000을 기준으로 오름차순 정렬된 것을 확인할 수 있습니다. 내림차순으로 정렬하고 싶다면 쿼리 마지막에 DESC 키워드를 추가하면 됩니다. 참고로 CAST를 사용하지 않으면 문자열 비교가 수행되어 의도와 다른 정렬 결과가 나올 수 있으므로, 반드시 숫자 타입으로 변환한 뒤 정렬하는 것이 안전합니다.