加入值列表

时间:2019-03-21 13:49:57

标签: sql postgresql

我有两个表:

ID|name1|fkey
1 |foo  |345, 567


ID |name2 |
345|hello |
567|world |
789|bar   |

因此,第一个表在一个单元格中有一个键列表。 如何连接这些表以获得以下结果:

ID |name2|name1
345|hello|foo
567|world|foo
789|bar  | <null>

通常的联接不起作用,因为“ fkey”列包含键列表。

3 个答案:

答案 0 :(得分:1)

使用split_part()并退出联接

select t2.*,a.name1 from t2 left join
(select id,name1, split_part(fkey,',',1) as key1 
from t1
union 
select id,name1, split_part(fkey,',',2) as key1 
from t1
) a on a.key=t2.id

答案 1 :(得分:0)

这是一种可怕的数据格式。但是您可以在Postgres中做到这一点:

select t2.*, t1.name1
from t2 left join
     (t1 cross join lateral
      regexp_split_to_table(t1.fkey, ', ') r(val)
     )
     on t2.id = r.val;

然后,修复您的数据结构,以便拥有正确的联结表!

答案 2 :(得分:0)

在postgresql中,如果您的列是数组,则可以

SELECT a.*
  FROM table1 AS a
  JOIN table2 AS b on a.id = ANY(b.column_array)

https://www.postgresql.org/docs/9.2/arrays.html