患有 I 型糖尿病的病人:前缀匹配要卡住单词边界
LeetCode 1527 · LIKE 模糊匹配、多值字段
面试怎么回答
条件写成 conditions LIKE 'DIAB1%' OR conditions LIKE '% DIAB1%',保证 DIAB1 出现在某个代码的开头。我还会指出多值字段是建模问题,正确做法是拆成明细表,再用等值或前缀条件查询。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
病人表的病症字段是用空格分隔的多个病症代码。I 型糖尿病的代码以 DIAB1 开头。找出患有 I 型糖尿病的病人。
表结构
- Patients:patient_id(主键)、patient_name、conditions(空格分隔的代码)
思路
要找的是「某个代码以 DIAB1 开头」,代码要么在字段开头,要么前面紧跟一个空格。所以条件是 conditions LIKE 'DIAB1%' OR conditions LIKE '% DIAB1%'。原解法用 %DIAB1%,会把 ADIAB100 这种中间含有 DIAB1 的代码也匹配上。
参考解法
select patient_id , patient_name ,conditions
from Patients
where conditions like '%DIAB1%'
另一种写法:卡住代码的开头位置
SELECT patient_id, patient_name, conditions
FROM Patients
WHERE conditions LIKE 'DIAB1%' OR conditions LIKE '% DIAB1%'
易错点
LIKE '%DIAB1%'不区分代码边界,会误匹配。- 把多个值塞进一个字段本身违反第一范式,数仓里应该拆成「病人 - 病症」明细表。