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

MySQL에서 LIKE 조건으로 정렬하는 방법 (ORDER BY + CASE 활용)

MySQL에서 특정 패턴과 일치하는 행을 우선적으로 정렬하고 싶을 때가 있습니다. 예를 들어, 이름에 'Taylor'가 포함된 행을 가장 먼저, 'Miller'가 포함된 행을 그다음으로 출력하고 싶은 경우입니다. 이럴 때는 CASE 문LIKE 연산자를 함께 사용하면 됩니다.

기본 문법

ORDER BY 절 안에 CASE 문을 작성하여, LIKE 패턴에 따라 정렬 순위를 지정하는 방식입니다. 기본 문법은 다음과 같습니다.

SELECT * FROM yourTableName
    ORDER BY CASE
    WHEN yourColumnName LIKE '%yourPatternValue1%' THEN 1
    WHEN yourColumnName LIKE '%yourPatternValue2%' THEN 2
    ELSE 3
END;

CASE 문이 각 행에 대해 숫자 값을 반환하고, MySQL은 그 값을 기준으로 오름차순 정렬을 수행합니다. 즉, 첫 번째 패턴에 일치하면 1, 두 번째 패턴에 일치하면 2, 어느 것도 일치하지 않으면 3이 부여되어 원하는 우선순위대로 결과가 정렬됩니다.

예제 테이블 생성

실제 동작을 확인하기 위해 테스트용 테이블을 만들어 보겠습니다.

mysql> CREATE TABLE OrderByLikeDemo
    -> (
    -> Id INT,
    -> Name VARCHAR(100)
    -> );
Query OK, 0 rows affected (1.84 sec)

데이터 삽입

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

mysql> INSERT INTO OrderByLikeDemo VALUES(100,'John Smith');
Query OK, 1 row affected (0.18 sec)

mysql> INSERT INTO OrderByLikeDemo VALUES(101,'Carol Taylor');
Query OK, 1 row affected (0.23 sec)

mysql> INSERT INTO OrderByLikeDemo VALUES(102,'David Miller');
Query OK, 1 row affected (0.12 sec)

mysql> INSERT INTO OrderByLikeDemo VALUES(103,'Mike Taylor');
Query OK, 1 row affected (0.18 sec)

mysql> INSERT INTO OrderByLikeDemo VALUES(104,'Bob Miller');
Query OK, 1 row affected (0.11 sec)

mysql> INSERT INTO OrderByLikeDemo VALUES(105,'Sam Williams');
Query OK, 1 row affected (0.16 sec)

전체 데이터 조회

SELECT 문으로 저장된 모든 레코드를 확인해 보겠습니다.

mysql> SELECT * FROM OrderByLikeDemo;

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

+------+--------------+
| Id   | Name         |
+------+--------------+
| 100  | John Smith   |
| 101  | Carol Taylor |
| 102  | David Miller |
| 103  | Mike Taylor  |
| 104  | Bob Miller   |
| 105  | Sam Williams |
+------+--------------+
6 rows in set (0.00 sec)

LIKE 패턴 기반 정렬 쿼리 실행

이제 이름(Name) 컬럼에 'Taylor'가 포함된 행을 첫 번째로, 'Miller'가 포함된 행을 두 번째로 정렬하는 쿼리를 작성해 보겠습니다.

mysql> SELECT * FROM OrderByLikeDemo
    -> ORDER BY CASE
    -> WHEN Name LIKE '%Taylor%' THEN 1
    -> WHEN Name LIKE '%Miller%' THEN 2
    -> ELSE 3
    -> END;

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

+------+--------------+
| Id   | Name         |
+------+--------------+
| 101  | Carol Taylor |
| 103  | Mike Taylor  |
| 102  | David Miller |
| 104  | Bob Miller   |
| 100  | John Smith   |
| 105  | Sam Williams |
+------+--------------+
6 rows in set (0.00 sec)

결과 분석

출력 결과를 보면 'Taylor'가 포함된 Carol Taylor와 Mike Taylor가 가장 먼저 조회되었고, 그다음으로 'Miller'가 포함된 David Miller와 Bob Miller가 나왔습니다. 나머지 John Smith와 Sam Williams는 어떤 패턴에도 일치하지 않아 ELSE 값인 3이 적용되어 마지막에 정렬되었습니다.

정리 및 추가 팁

이처럼 CASE 문의 반환값을 활용하면 단순한 알파벳순이나 숫자순 정렬이 아닌, 비즈니스 로직에 맞는 사용자 지정 정렬을 구현할 수 있습니다. 몇 가지 추가 팁은 다음과 같습니다.

- 여러 패턴이 필요하면 WHEN 절을 계속 추가하면 되며, ELSE 값은 나머지 행들의 상대적 순서를 결정합니다.
- 내림차순으로 정렬하고 싶다면 CASE 문 뒤에 DESC 키워드를 붙이면 됩니다.
- 동일한 우선순위 내에서 추가 정렬 기준이 필요하다면 쉼표(,)로 구분하여 두 번째 정렬 컬럼을 지정할 수 있습니다. 예: ORDER BY CASE ... END, Name ASC;