본문 바로가기
Data Science/SQL

[SQL/오답] LIKE의 함정과 REGEXP 활용한 패턴 매칭 (LeetCode 1527 Easy)

by 에르모사 쩐뉴 2026. 2. 15.

1. Problem

병원 환자 데이터에서 'Type I Diabetes'를 앓고 있는 환자를 찾아야 한다. 조건은 질병 코드(conditions) 중 하나가 DIAB1으로 시작해야 한다는 것이다. 하나의 컬럼에 공백으로 구분된 여러 질병 코드가 섞여 있으므로, 다른 단어의 일부로 포함된 DIAB1(예: SADIAB1)은 제외하고 '단어의 시작점'에 위치한 것만 골라내는 것이 기술적 과제이다.

2. Solution

단순 포함 조건(%DIAB1%)의 오류를 극복하기 위해 공간적 경계를 고려한 두 가지 접근법을 사용한다.

[방법 A] LIKE를 이용한 이중 필터링DIAB1이 문장의 맨 앞에 오는 경우와, 중간에 공백 뒤에 오는 경우를 각각 지정한다.

[방법 B] 정규표현식(REGEXP)을 이용한 경계 탐색 (권장) 단어의 경계를 뜻하는 메타 문자(\b)를 활용하여 쿼리를 획기적으로 단축한다.

  • \\b (Word Boundary): 문자열의 시작 또는 공백과 같은 '단어의 경계'를 식별한다. 이를 통해 SADIAB1은 걸러내고 ACNE DIAB100은 정확히 찾아낼 수 있다.

3. Takeaway (패턴 매칭의 정밀도와 정규표현식)

텍스트 데이터를 다룰 때 분석가가 갖춰야 할 객관적인 검증 태도를 정립한다.

  • LIKE %의 함정 인식: 단순히 양옆에 와일드카드를 붙이는 방식은 의도치 않은 데이터를 포함할 위험이 크다. 분석가는 항상 '포함'과 '일치' 그리고 '접두/접미'의 차이를 데이터 구조 관점에서 의심해야 한다.
  • 엣지 케이스(Edge Case) 대응: 데이터가 문장의 처음에 올 때와 중간에 올 때의 차이를 인지하고 이를 처리하는 과정에서 쿼리의 견고함이 결정된다.
  • REGEXP의 전략적 가치: 복잡한 OR 조건이 나열될 때 정규표현식은 코드의 가독성을 높이고 유지보수를 용이하게 한다. 특히 단어 경계(\b)나 시작점(^) 등의 기호는 비정형 텍스트 정제 시 분석가의 가장 강력한 도구가 된다.

https://leetcode.com/problems/patients-with-a-condition/description/

Table: Patients

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| patient_id   | int     |
| patient_name | varchar |
| conditions   | varchar |
+--------------+---------+
patient_id is the primary key (column with unique values) for this table.
'conditions' contains 0 or more code separated by spaces. 
This table contains information of the patients in the hospital.
 

Write a solution to find the patient_id, patient_name, and conditions of the patients who have Type I Diabetes. Type I Diabetes always starts with DIAB1 prefix.

Return the result table in any order.

The result format is in the following example.

 

Example 1:

Input: 
Patients table:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 1          | Daniel       | YFEV COUGH   |
| 2          | Alice        |              |
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 |
| 5          | Alain        | DIAB201      |
+------------+--------------+--------------+
Output: 
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 | 
+------------+--------------+--------------+
Explanation: Bob and George both have a condition that starts with DIAB1.

[SQL/Easy] Patients With a Condition: 패턴 매칭의 함정

1. 문제 풀이의 핵심: "시작하는 단어" 찾기

이 문제의 핵심은 DIAB1이 단순히 포함된 것이 아니라, **어떤 질병 코드의 "접두사(Prefix)"**여야 한다는 점입니다.

❌ LIKE '%DIAB1%'이 위험한 이유

만약 환자의 질병 코드가 SADIAB100 (SADIAB1)이라면 어떻게 될까요?

  • 이 코드는 DIAB1으로 시작하지 않지만, 사용자님의 쿼리에서는 %...% 조건 때문에 결과에 포함되어 버립니다. (오답 발생)

2. 정답으로 가는 두 가지 방법

방법 A: LIKE를 활용한 정교한 필터링

DIAB1은 문장의 맨 처음에 올 수도 있고, 공백 뒤(두 번째 이후 단어)에 올 수도 있습니다.

 
SELECT patient_id, patient_name, conditions
FROM Patients 
WHERE conditions LIKE 'DIAB1%'      -- 문장의 시작이 DIAB1인 경우
   OR conditions LIKE '% DIAB1%';   -- 공백 뒤에 DIAB1이 오는 경우

방법 B: 정규 표현식(REGEXP) 활용 (강력 추천)

기업 쿼리 테스트에서 출제자가 가장 선호하는 방식입니다. 단어의 경계나 특정 패턴을 한 줄로 끝낼 수 있습니다.

SELECT patient_id, patient_name, conditions
FROM Patients 
WHERE conditions REGEXP '\\bDIAB1';
  • \\b: 단어의 경계(Word Boundary)를 의미합니다. 즉, 공백이나 문장 시작점 뒤에 바로 DIAB1이 오는 것만 찾아냅니다.

 

🎯 기업 쿼리테스트 출제자의 의도

이 문제는 난이도는 'Easy'지만, **'엣지 케이스(Edge Case)'**를 얼마나 꼼꼼하게 챙기는지 확인합니다.

① 예외 케이스 식별 능력

단순히 특정 단어가 포함된 것을 찾는 것과, 그 단어가 **'단어의 시작점'**인 것을 찾는 것은 데이터 정합성 면에서 엄청난 차이가 있습니다.

  • 의도: "데이터 오염(False Positive)을 방지할 수 있는가?"

② 정규 표현식(Regex) 숙련도

실무 데이터는 conditions 컬럼처럼 여러 값이 섞여 있는 경우가 많습니다. 이때 LIKE를 여러 개 쓰는 것보다 정규 표현식으로 깔끔하게 처리하는 능력을 높게 평가합니다.

  • 의도: "복잡한 텍스트 데이터를 효율적으로 핸들링할 수 있는가?"

🚩  "LIKE vs REGEXP"

"검색 조건이 복잡해질수록 정규표현식이 답이다."

  1. LIKE: 패턴이 단순할 때 빠르고 직관적입니다.
  2. REGEXP: "A로 시작하거나", "숫자로 끝나거나", "단어 경계에 있는" 등 정밀한 조건이 필요할 때 압도적입니다.