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"
"검색 조건이 복잡해질수록 정규표현식이 답이다."
- LIKE: 패턴이 단순할 때 빠르고 직관적입니다.
- REGEXP: "A로 시작하거나", "숫자로 끝나거나", "단어 경계에 있는" 등 정밀한 조건이 필요할 때 압도적입니다.
'Data Science > SQL' 카테고리의 다른 글
| [SQL/오답] 문자열 가공; CONCAT과 SUBSTR/UPPER/LOWER을 활용한 이름 표준화 (LeetCode1667 Easy) (0) | 2026.02.15 |
|---|---|
| [SQL/오답] 거래 없는 방문자 추출: WHERE NOT IN, LEFT JOIN, IS NULL 데이터 공백 분석 (LeetCode1581 Easy) (0) | 2026.02.15 |
| [SQL/오답] 다차원 그룹화와 중복 제거를 활용한 데모그래픽 지표 산출 (프로그래머스 Lv4) (0) | 2026.02.15 |
| [SQL/오답] 코호트 분석: 고정 분모와 동적 분자를 활용한 구매 비율 산출 (프로그래머스 Lv5) (0) | 2026.02.15 |
| [SQL] AARRR이란?, 쿼리테스트 출제 유형, 관련 함수 (0) | 2026.02.15 |