2014-07-15 60 views
-1

我试图比较两个表与类似但不是确切值。比较两个表中两个字段的值不完全匹配

表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,其中一些匹配除最后一个字符以外的所有字符。

+0

你能后,你已经尝试了查询? – Jenn

+0

这些值在每个表中都是唯一的吗?数据类型?基本上,你的表定义应该在问题中(在psql中是'\ d tbl')。另外,总是有6位数字,或者是你的例子误导?组必须匹配吗?你到目前为止尝试过什么? –

回答

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) 
+0

这正是我所需要的。谢谢! – dhuss

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); 
0

我建议left(id, -1)作为修剪的最后一个字符简单和最快的方法:在你的问题

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

没有证据表明团体必须匹配...