我试图将两个表与相似的但不是完全值进行比较。
表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。
答案 0 :(得分:2)
您可以使用明确的join
或exists
子句执行此操作:
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
您的问题中没有任何内容表明群组必须匹配......