MySQL에서 일부 조건만 일치하는 결과 가져오기
MySQL에서 WHERE 절은 기본적으로 모든 조건이 일치해야(AND) 또는 하나라도 일치하면(OR) 결과를 반환합니다. 하지만 여러 조건 중 일정 개수 이상만 일치하는 레코드를 찾고 싶다면 어떻게 해야 할까요? 예를 들어 4개의 표현식 중 3개 이상이 일치하는 행만 조회하고 싶은 경우가 그렇습니다.
이럴 때 CASE 문을 활용하면 간단하게 해결할 수 있습니다. 각 조건이 참일 때는 1, 거짓일 때는 0을 반환하도록 작성한 뒤, 그 합계가 원하는 개수(예: 3)보다 크거나 같은지 비교하면 됩니다.
기본 문법
SELECT * FROM yourTableName
WHERE CASE WHEN yourColumnName1 = yourValue1 THEN 1 ELSE 0 END +
CASE WHEN yourColumnName2 = yourValue2 THEN 1 ELSE 0 END +
CASE WHEN yourColumnName3 = yourValue3 THEN 1 ELSE 0 END +
...
CASE WHEN yourColumnNameN = yourValueN THEN 1 ELSE 0 END >= 3;각 CASE 문은 해당 열의 값이 지정한 값과 일치하면 1을, 그렇지 않으면 0을 반환합니다. 이 값들을 모두 더한 결과가 3 이상이면, 즉 최소 3개의 조건이 일치하면 해당 행이 결과에 포함됩니다.
실습용 테이블 생성하기
문법을 이해하기 위해 먼저 테이블을 생성해 보겠습니다.
mysql> create table UserInformation
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> FirstName varchar(20),
-> LastName varchar(20),
-> Age int,
-> Marks int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.58 sec)샘플 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into UserInformation(FirstName,LastName,Age,Marks) values('John','Smith',22,89);
Query OK, 1 row affected (0.12 sec)
mysql> insert into UserInformation(FirstName,LastName,Age,Marks) values('Carol','Taylor',21,80);
Query OK, 1 row affected (0.19 sec)
mysql> insert into UserInformation(FirstName,LastName,Age,Marks) values('John','Doe',24,81);
Query OK, 1 row affected (0.14 sec)
mysql> insert into UserInformation(FirstName,LastName,Age,Marks) values('David','Miller',29,99);
Query OK, 1 row affected (0.15 sec)
mysql> insert into UserInformation(FirstName,LastName,Age,Marks) values('Mitchell','Johnson',22,65);
Query OK, 1 row affected (0.13 sec)저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from UserInformation;
실행 결과는 다음과 같습니다.
+----+-----------+----------+------+-------+ | Id | FirstName | LastName | Age | Marks | +----+-----------+----------+------+-------+ | 1 | John | Smith | 22 | 89 | | 2 | Carol | Taylor | 21 | 80 | | 3 | John | Doe | 24 | 81 | | 4 | David | Miller | 29 | 99 | | 5 | Mitchell | Johnson | 22 | 65 | +----+-----------+----------+------+-------+ 5 rows in set (0.00 sec)
4개 조건 중 3개 이상 일치하는 레코드 조회하기
이제 모든 조건이 아닌 일부 조건만 일치하는 레코드를 추출하는 쿼리를 살펴보겠습니다. 아래 예제는 FirstName이 'Mitchell', LastName이 'Johnson', Age가 22, Marks가 67이라는 네 가지 조건 중 3개 이상 일치하는 행을 찾습니다.
mysql> select *from UserInformation
-> where case when FirstName = 'Mitchell' then 1 else 0 end +
-> case when LastName = 'Johnson' then 1 else 0 end +
-> case when Age = 22 then 1 else 0 end +
-> case when Marks = 67 then 1 else 0 end >= 3;Mitchell Johnson 레코드를 보면 FirstName, LastName, Age 세 조건은 일치하지만 Marks는 65로 67과 일치하지 않습니다. 따라서 4개 조건 중 3개가 일치하므로 결과에 포함됩니다.
실행 결과는 다음과 같습니다.
+----+-----------+----------+------+-------+ | Id | FirstName | LastName | Age | Marks | +----+-----------+----------+------+-------+ | 5 | Mitchell | Johnson | 22 | 65 | +----+-----------+----------+------+-------+ 1 row in set (0.00 sec)
마무리
CASE 문을 조건별로 나열하고 그 결과를 합산하는 방식을 사용하면, AND나 OR 연산자로는 표현하기 어려운 "N개 조건 중 M개 이상 일치" 검색을 손쉽게 구현할 수 있습니다. 조건의 개수와 임계값(위 예제에서는 3)만 변경하면 다양한 상황에 유연하게 적용할 수 있으므로, 부분 일치 검색이 필요한 경우 유용하게 활용해 보시기 바랍니다.