统计工作中经常存在一个情况:
想要从科室表TableDept 中匹配筛选数据,但因为科室命名时,不一定完全匹配这些字样,导致无法用 in 来直接检索。比如口腔科,在科室命名中可能存在的情况有‘口腔一科’、‘口腔二科’等,因此需要进行模糊匹配,把含‘口腔’字样的科室都筛选出来。
这里记录的是列Dept_name 中含 '口腔', '眼科', '耳鼻喉' 等字样的科室纳入/排除的实践操作。
一般情况下,我们会选用 like/ not like 结合 or/ and的形式来筛选数据:
--纳入口腔科、眼科、耳鼻喉科
select *
from TableDept t
where t.Dept_name like '%口腔%'
or t.Dept_name like '%眼科%'
or t.Dept_name like '%耳鼻喉%'
;
--排除口腔科、眼科、耳鼻喉科
select *
from TableDept t
where t.Dept_name not like '%口腔%'
and t.Dept_name not like '%眼科%'
and t.Dept_name not like '%耳鼻喉%'
;
但是重复的写 like/ not like 语句很啰嗦,如果需要纳排的字样较多,处理起来极不方便。
因此,考虑使用 Exists/ Not Exists 来实现快速添加字样。
--纳入口腔科、眼科、耳鼻喉科
select *
from TableDept t
where exists (select 1
from (
value('口腔'),('眼科'),('耳鼻喉') --其他科室在此处修改
) as textvalue(dept)
where t.dept_name like '%'+textvalue.dept+'%'
)
;
--排除口腔科、眼科、耳鼻喉科
select *
from TableDept t
where not exists (select 1
from (
value('口腔'),('眼科'),('耳鼻喉') --其他科室在此处修改
) as textvalue(dept)
where t.dept_name like '%'+textvalue.dept+'%'
)
;
使用exists可以快速的添加要纳排的字样,同时也加强了代码的可读性和可维护性。