订阅更新

患有 I 型糖尿病的病人:前缀匹配要卡住单词边界

SQL 实战 123 题 · 第 120 题 简单 约 2 分钟读完

LeetCode 1527 · LIKE 模糊匹配、多值字段

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

条件写成 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%' 不区分代码边界,会误匹配。
  • 把多个值塞进一个字段本身违反第一范式,数仓里应该拆成「病人 - 病症」明细表。
刷题进度保存在当前浏览器