MySQL에서 특정 조건에 맞는 레코드를 우선적으로 정렬하려면 ORDER BY 절과 LIKE 연산자, 그리고 CASE 표현식을 함께 사용하면 됩니다. 이 방법을 활용하면 원하는 패턴과 일치하는 데이터를 맨 앞으로 보내고, 나머지 데이터는 일반적인 기준으로 정렬할 수 있습니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable808(Value varchar(100)); Query OK, 0 rows affected (0.61 sec)
2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable808 values('smith');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable808 values('Adamsmith');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable808 values('Carolsmith');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable808 values('smithJohn');
Query OK, 1 row affected (0.16 sec)3. 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from DemoTable808;
실행 결과는 다음과 같습니다.
+------------+ | Value | +------------+ | smith | | Adamsmith | | Carolsmith | | smithJohn | +------------+ 4 rows in set (0.00 sec)
4. 특정 순서로 정렬하는 쿼리 작성하기
'smith'로 시작하는 값들을 우선적으로 출력하고, 나머지 값들은 알파벳순으로 정렬하려면 아래와 같은 쿼리를 사용합니다.
mysql> select *from DemoTable808 order by case when Value like 'smith%' then 0 else 1 end asc, Value asc;
여기서 핵심은 CASE 표현식입니다. LIKE 연산자로 'smith%' 패턴과 일치하는 레코드에는 0을 부여하고, 그 외의 레코드에는 1을 부여합니다. 오름차순(ASC) 정렬이므로 0인 레코드가 먼저 출력되고, 같은 우선순위 내에서는 Value 컬럼 기준으로 알파벳순 정렬이 적용됩니다.
실행 결과는 다음과 같습니다.
+------------+ | Value | +------------+ | smith | | smithJohn | | Adamsmith | | Carolsmith | +------------+ 4 rows in set (0.00 sec)
정리
결과를 보면 'smith'와 'smithJohn'처럼 'smith'로 시작하는 레코드가 먼저 출력되고, 'Adamsmith'와 'Carolsmith'는 알파벳순으로 뒤따르는 것을 확인할 수 있습니다. 이처럼 ORDER BY 절 안에서 CASE WHEN과 LIKE를 조합하면 별도의 정렬용 컬럼을 추가하지 않고도 유연하게 사용자 지정 정렬 순서를 구현할 수 있습니다. 특정 키워드가 포함된 데이터를 상단에 노출해야 하는 검색 결과 페이지나 목록 화면을 개발할 때 특히 유용한 기법입니다.