目录
语法
xxx like 语句用于在WHERE子句中搜索特定模式的字符串。这里的xxx是表中的一个列名,而like后面跟着的是要匹配的模式,模式中可以包含通配符来代表任意数量的字符。
最常见的通配符有两个:
- %:代表零个、一个或多个字符。
- _:代表单个字符。
当使用LIKE进行模糊匹配时,性能可能会受到影响,特别是当在大型数据集上执行且没有适当的索引时。在某些数据库系统中,如果xxx列包含NULL值,并且试图使用LIKE来搜索这些值,那么这些NULL值将不会被匹配,因为NULL表示“未知”或“无值”,而不是空字符串或任何特定的文本值。要包括NULL值,可能需要使用IS NULL条件或COALESCE函数等策略。
在SQL中,要实现检索特定字符串也可以通过regexp,这是一个强大的字符串匹配函数,它使用正则表达式(Regular Expressions)来搜索和匹配字符串模式。正则表达式是一种文本模式,包括普通字符(如字母a到z)和特殊字符(称为“元字符”),这些特殊字符定义了字符的搜索模式。
需求
患者信息表: 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
。
示例
输入: 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 开头的疾病。
分析
查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。
需要检索特定的含有DIAB1字符串的内容,考虑like语句或者regexp语句,这两种均可检索指定的字符串
like语句实现检索含有DIAB1字符串
conditions列含有DIAB1的字符串存在两种情况,一种是DIAB1在首位,那么 'DIAB1%'即可指代这类字符串
另一种是DIAB1在中间或末位,同时需要避免DDIAB1等其他代码相似的疾病,通过'% DIAB1%'指代这类字符串
where conditions like 'DIAB1%' or conditions like '% DIAB1%'
regexp语句实现检索含有DIAB1字符串
在正则表达式中,\\bDIAB1 表示匹配以 DIAB1 开头且前面是单词边界的字符串。可以一次处理上述两种情况
where conditions regexp '\\bDIAB1'
代码
select *
from Patients
where conditions like 'DIAB1%' or conditions like '% DIAB1%'
OR
select patient_id, patient_name, conditions
from Patients
where conditions regexp '\\bDIAB1'