我有两个表:
Books
和列tag_ids
(数组)
Tags
和列tag_id
(Varchar)
我有一个可视化工具,需要将这些表连接在一起。我唯一可以控制的是联接条件。 问题是我找不到使这种联接起作用的方法。
这是我尝试过的:
FROM "PUBLIC"."BOOKS"
LEFT JOIN "PUBLIC"."TAGS" ON ( "tag_ids" = TO_ARRAY("tag_id"))
这仅适用于具有一个元素的数组。不适用于以下情况:
tag_ids =
[
"211d1383-13a6-4bef-85d1-bf5eda11c8a7",
"2f6c332e-4726-4425-b364-e668e0f56582"
]
tag_id =
["211d1383-13a6-4bef-85d1-bf5eda11c8a7"]
试图做:
FROM "PUBLIC"."BOOKS"
LEFT JOIN "PUBLIC"."TAGS" ON ( ARRAYS_OVERLAP ("tag_ids" , TO_ARRAY("tag_id")) = TRUE ) )
我不知道这是否可行,但它确实是证书产品,需要15+的时间才能运行,所以我还是不能使用它。
我正在寻找的基本上是要问
if tag_id exist in tag_ids
我敢肯定有一个简单的解决方案。
答案 0 :(得分:1)
展开数组和join
:
select b.*, t.*
from public.books b cross join
table(flatten(b.tags)) bt join
tags t
on bt.tags = t.tag_id;
答案 1 :(得分:1)
您要使用array_contains
函数。
FROM "PUBLIC"."BOOKS"
LEFT JOIN "PUBLIC"."TAGS" ON (array_contains(tag_id, tag_ids))
请参阅文档here。