Sql 加入值列表

Sql 加入值列表,sql,postgresql,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> ID | name2 | name1 345 |你好|福 567 |世界|福 789巴 通常的联接不起

我有两张桌子:

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>
ID | name2 | name1
345 |你好|福
567 |世界|福
789巴
通常的联接不起作用,因为列“fkey”包含键列表。

使用
split\u part()
和left join

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

这是一种糟糕的数据格式。但你可以在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;

然后,修复您的数据结构,以便有一个合适的连接表

在postgresql中,如果列是数组,则可以执行以下操作

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

不要将数据存储为逗号分隔的项目,这只会给您带来很多麻烦!这不是一个好的设计。在MSSQL中,您现在可以使用内置函数拆分逗号上的字段,并选择解析值的位置。我不确定postgresql内置中是否存在这种情况,但我肯定有代码可以找到。这不是外键应该如何存储的。序列化FKs违背了使用RDBMS的目的。请使用表架构信息更新问题。具体来说,
fkey
是逗号分隔的字符串、postgres数组、json数组还是jsonb数组?这样存储数据的不是我。不幸的是,我不得不处理它。