OR条件匹配评分的SQL

时间:2017-09-04 23:43:51

标签: sql sql-server oracle

我有一个要求,我自己加入一个表格,例如员工,我的条件是姓名匹配加上姓氏匹配的任何三列或出生日期或电子邮件或电话或城市或国家匹配所以名字必须匹配,然后提到匹配的三个列中的任何一个,我怎么能这样做我的SQL?

SQL类似于:

where c1.firstname=c2.firstname
and ( c1.lastname = c2.lastname or c1.dob = c2.dob or ....)

我很难执行任何3个属性匹配的要求

2 个答案:

答案 0 :(得分:3)

您可以将OR替换为每个匹配添加1的条件总和,计算匹配数,并过滤总数:

where c1.firstname=c2.firstname and
    (case when c1.lastname = c2.lastname then 1 else 0 end
    +case when c1.dob = c2.dob then 1 else 0 end
    +case when c1.addr1 = c2.addr1 then 1 else 0 end
    +case when c1.addr2 = c2.addr2 then 1 else 0 end
    +case when c1.phone = c2.phone then 1 else 0 end) >= 3

答案 1 :(得分:1)

首先,您应该在 on 子句中进行比较,而不是where子句。

其次,你可以统计比赛:

select c1.*, c2.*
from c c1 join
     c c2
     on c1.firstname = c2.firstname and
        ((case when c1.lastname = c2.lastname then 1 else 0 end) + 
         (case when c1.dob = c2.dob then 1 else 0 end) + 
         (case when c1.email = c2.email then 1 else 0 end) + 
         (case when c1.phone = c2.phone then 1 else 0 end) + 
         (case when c1.city = c2.city then 1 else 0 end) + 
         (case when c1.country = c2.country then 1 else 0 end)
        ) >= 3;

第三,小心比赛。如果city匹配,则country可能也匹配 - 并且很多人可以在同一个城市拥有相同的名字。