[每日一练]MySQL的模糊匹配和正则表达式来查找开头的特殊字符
#改题目来源于力扣:
题目要求:
患者信息表: 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 开头的疾病。
思路流程:
1.由此可见,我们需要返回字符串是以前缀“DIAB1”的所有患者,这时候可以利用正则表达式进行匹配:
\\bDIAB1
其中\b表达匹配单词边界,放在字符串前可以匹配以这个字符串开头的字符串,放在字符串后可以匹配以这个字符串结尾的字符串,放在两边表示只匹配这个字符串。\\b表示对\b进行转义。
2.当然,我们可以利用MySQL的模糊匹配进行查找。%作为通配符,和正则表达式里的\b有区别:
%字符串
:匹配以“字符串”结尾的记录。字符串%
:匹配以“字符串”开头的记录。%字符串%
:匹配包含“字符串”的记录。
在这里,我们可以发现以DIAB1开头的情况有两种,一种是DIAB1位于字符串首位,一种是DIAB1位于总字符串中间,被空格隔开了,所以它的开头有一个空格,利用模糊匹配要考虑到所有情况,比正则表达式难一些。
"DIAB1%" OR "% DIAB1%"
#以“DIAB1”开头的字符串以及包含“ DIAB1”的字符串
代码实现:
# Write your MySQL query statement below
SELECT *
FROM Patients
WHERE conditions REGEXP '\\bDIAB1'
或者:
SELECT *
FROM Patients
WHERE conditions LIKE "DIAB1%" OR conditions LIKE "% DIAB1%"
题后思考:
既然要表达开头,为什么不可以用'^DIAB1'而是用''\\bDIAB1'?
因为“^”符号表达的开头匹配,必须且只能在最前面才可以,而题目中所谓的“开头”DIAB1,有时候会在第二个字符串里,不再最前方第一个字符串的开头,造成BUG.
而\b表达的是字符串的边界,即如果把\b放在DIAB1之前,不管DIAB1在第几个字符串,只要是以它开头就都会匹配到。
原文地址:https://blog.csdn.net/2302_77975940/article/details/142359671
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!