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

MySQL에서 4개 조건 중 3개 이상 일치하는 레코드 조회하는 방법

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)만 변경하면 다양한 상황에 유연하게 적용할 수 있으므로, 부분 일치 검색이 필요한 경우 유용하게 활용해 보시기 바랍니다.