问题描述
我得到了一个带有姓名的患者列表,我正在尝试与我们数据库中已有的列表进行匹配,但由于患者列表中姓名字段的格式,我遇到了问题。此列表取自网络表单,因此人们可以随意输入姓名,因此不会很好地匹配。
WEBFORM_NAME | PATIENT_NAME |
---|---|
约翰·史密斯 | SMITH,JOHN L |
香农布朗 | 布朗,香农玛丽 |
有没有办法在这样的实例中使用 LIKE 子句?我真正需要的是 LIKE 子句来查找名字,因为我已经加入了电话号码和电子邮件地址。我的问题是当家庭拥有相同的电话号码和电子邮件地址(例如配偶)时,我只想返回家庭中合适的人。
解决方法
不确定您是否只需要获取名字,这里是获取名字的 WIldCard 表达式
SELECT LEFT(WEBFORM_NAME,CHARINDEX(' ',WEBFORM_NAME)-1) AS FirstName1,SUBSTRING(PATIENT_NAME,CHARINDEX(',',PATIENT_NAME)+1,(CHARINDEX(' ',PATIENT_NAME)-CHARINDEX(',PATIENT_NAME))) AS FirstName2
FROM yourTable
,
这里的假设似乎是网络表单(用户将手动输入)名称的格式为 <First Name> [<optional middle Name(s)>] <Last Name>
,其中存储在表中的数据的格式为 <Last Name>,<First Name> [<optional middle Name(s)>]
.这不是一门精确的科学,但由于其他标准(如电子邮件、电话等)已匹配最佳情况
select *
from webform w,patient p
where
-- extract just the last name and match that
regexp_like(p.name,'^' ||
regexp_extract(w.name,'([^[:space:],][[:space:],])*([^[:space:],]+)',1,2))
and -- extract the first name and match it
regexp_like(p.name,[[:space:]]*' ||
regexp_extract(w.name,'(^[^[:space:],]+)'))
由于网络表单是自由形式的用户输入,因此很难处理缩写的中间名和其他变体,因此使用上述内容将进行基于名字和姓氏的匹配,除了您已经在进行的匹配之外,这应该会有所帮助。