如何在 Snowflake 中将数组与字符串连接

Hal*_*oKu 5 sql snowflake-cloud-data-platform

我有两张桌子:

Books带列tag_ids(数组)

Tags带列tag_id(Varchar)

我有一个可视化工具需要将这些表连接在一起。我唯一可以控制的是连接条件。问题是我找不到办法让这个连接起作用。

这是我尝试过的:

FROM "PUBLIC"."BOOKS"
LEFT JOIN "PUBLIC"."TAGS" ON (  "tag_ids" =  TO_ARRAY("tag_id")) 
Run Code Online (Sandbox Code Playgroud)

这只适用于只有一个元素的数组。它不适用于以下情况:

标签 ID =

[
  "211d1383-13a6-4bef-85d1-bf5eda11c8a7",
  "2f6c332e-4726-4425-b364-e668e0f56582"
]
Run Code Online (Sandbox Code Playgroud)

标签 ID =

 ["211d1383-13a6-4bef-85d1-bf5eda11c8a7"]
Run Code Online (Sandbox Code Playgroud)

尝试做:

FROM "PUBLIC"."BOOKS"
LEFT JOIN "PUBLIC"."TAGS" ON ( ARRAYS_OVERLAP ("tag_ids" ,  TO_ARRAY("tag_id")) = TRUE ) ) 
Run Code Online (Sandbox Code Playgroud)

我不知道这是否有效,但它确实是 certisian 产品并且需要 15+ 才能运行,所以我无论如何都不能使用它。

我要找的基本上是问

if tag_id exist in tag_ids
Run Code Online (Sandbox Code Playgroud)

我确信有一个简单的解决方案。

win*_*ner 9

您想使用该array_contains功能。

FROM "PUBLIC"."BOOKS"
LEFT JOIN "PUBLIC"."TAGS" ON (array_contains(tag_id, tag_ids))
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档。


Gor*_*off 6

展平数组并join

select b.*, t.*
from public.books b cross join
     table(flatten(b.tags)) bt join
     tags t
     on bt.tags = t.tag_id;
Run Code Online (Sandbox Code Playgroud)