2014-07-15 99 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 

沒有證據表明團體必須匹配...