比较两个表中的两个字段,其中值不完全匹配

时间:2014-07-15 21:14:28

标签: sql postgresql pattern-matching

我试图将两个表与相似的但不是完全值进行比较。

表1如下:

Group     ID    
G1        101939    
G1        181933            
G3        291940    

表2看起来像

Group     ID      
G1        101939R
G1        101939L
G1        181933R
G2        201943R   
G2        241947L   
G3        291940R

我想返回这样的内容:

Group     ID        Match?
G1        101939R   Yes
G1        101939L   Yes
G1        181933R   Yes
G2        201943R   No
G2        241947L   No
G3        291940R   Yes

基本上,表2的ID比表1多,其中一些匹配除了最后一个字符以外的所有ID。

3 个答案:

答案 0 :(得分:2)

您可以使用明确的joinexists子句执行此操作:

select t.*,
       (case when exists (select 1
                          from table1 t1
                          where t1.group = t2.group and
                                t2.id like t1.id || '_'
                         )
        then 'Yes' else 'No'
        end) as Matches
from table2 t2;

如果您想允许完全匹配以及缺少最后一个字符的匹配,请使用:

                          where t1.group = t2.group and
                                (t2.id like t1.id || '_' or t2.id = t1.id)

答案 1 :(得分:0)

另一种选择,如果table2中列出了所有组,并且ID的开头有六个需要比较的数字:

SELECT t2."group", t2.id, t1.id IS NOT NULL
FROM table2 t2
LEFT JOIN table1 t1 ON (t1."group" = t2."group" AND t1.id = SUBSTRING(t2.id for 6)::INTEGER);

答案 2 :(得分:0)

我建议left(id, -1)是修剪最后一个字符的最简单,最快捷的方式:

SELECT *, EXISTS (SELECT 1 FROM tbl1 WHERE t1.id = left(t2.id, -1)) AS match
FROM   tbl2 t2

您的问题中没有任何内容表明群组必须匹配......