题目:
1527.患某种疾病的患者
患者信息表: Patients
±-------------±--------+
| Column Name | Type |
±-------------±--------+
| patient_id | int |
| patient_name | varchar |
| conditions | varchar |
±-------------±--------+
在 SQL 中,patient_id (患者 ID)是该表的主键。
‘conditions’ (疾病)包含 0 个或以上的疾病代码,以空格分隔。
这个表包含医院中患者的信息。
查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。
按 任意顺序 返回结果表。
查询结果格式如下示例所示。
示例 1:
输入:
Patients表:
±-----------±-------------±-------------+
| patient_id | patient_name | conditions |
±-----------±-------------±-------------+
| 1 | Daniel | YFEV COUGH |
| 2 | Alice | |
| 3 | Bob | DIAB100 MYOP |
| 4 | George | ACNE DIAB100 |
| 5 | Alain | DIAB201 |
±-----------±-------------±-------------+
输出:
±-----------±-------------±-------------+
| patient_id | patient_name | conditions |
±-----------±-------------±-------------+
| 3 | Bob | DIAB100 MYOP |
| 4 | George | ACNE DIAB100 |
±-----------±-------------±-------------+
解释:Bob 和 George 都患有代码以 DIAB1 开头的疾病。
思路A:
由于涉及到匹配文本,所以引入LIKE运算符,用于 WHERE在列中搜索指定的模式。
结合题目的查询条件为“I 类糖尿病的代码总是包含前缀 DIAB1”:
a)文字开头即为DIAB1
b)文字空格后包含DIAB1
所以使用SELECT语句查出patient_id,patient_name,conditions。
由于两个条件只要满足一个即可,所以引入OR关键词进行选择。
最后,再使用WHERE关键字和LIKE运算符结合筛选即可。
代码A:
SELECT patient_id,patient_name,conditions
FROM Patients
WHERE conditions LIKE 'DIAB1%'
OR conditions LIKE '% DIAB1%'
思路B:
由于涉及到匹配文本,所以考虑正则表达式。
结合题目的查询条件为“I 类糖尿病的代码总是包含前缀 DIAB1”:
a)文字开头即为DIAB1
b)文字空格后包含DIAB1
所以使用SELECT语句查出patient_id,patient_name,conditions。
由于两个条件只要满足一个即可,所以引入| 管道符号进行选择,作用等同于OR关键词。
最后,再使用WHERE关键字和 ^模式(匹配输入字符串的开始位置)和 \s(匹配一个空白字符) 结合筛选即可。
tips:MySQL要求两个反斜杠
代码B:
SELECT patient_id,patient_name,conditions
FROM Patients
WHERE conditions REGEXP '^DIAB1|\\sDIAB1'