加入变体(数组)雪花中的 ID

T. *_*ung 5 sql snowflake-schema snowflake-cloud-data-platform

我创建了两个表 t1 和 t2,如下所示:

创建表

CREATE TABLE t1(
    id integer AUTOINCREMENT START 1 INCREMENT 1,
    name varchar(10) DEFAULT RANDSTR(10, random()),
    id_array variant,
) 

CREATE TABLE t2(
    id integer AUTOINCREMENT START 1 INCREMENT 1,
    name varchar(10) DEFAULT RANDSTR(10, random())
)
Run Code Online (Sandbox Code Playgroud)

目标

如果记录的 id 存在于 t1 变体数组中,我希望将 t2 连接到 t1。

我尝试过的

我遇到了 ARRAY_CONTAINS 函数,它看起来很完美。但通过以下内容我没有收到任何结果:

SELECT t1.id, t2.name
FROM t1, t2 
WHERE ARRAY_CONTAINS(t1.id_array, array_construct(t2.id))
Run Code Online (Sandbox Code Playgroud)

我如何得到这个?

关于如何实现以下结果有什么建议吗?

t1 record: 
{id: 1, name: 'A-123', ids_array: '["1", "2"]'}

t2 records:
{id: 1, name: 'test'},
{id: 2, name: 'test2'}
Run Code Online (Sandbox Code Playgroud)

期望的结果

{id: 1, name: 'A-123', joined_name: 'test'},

{id: 1, name: 'A-123', joined_name: 'test2'}
Run Code Online (Sandbox Code Playgroud)

Sim*_*rim 2

因此,为了调试正在发生的情况,我在下面的 SQL 中添加了越来越多的行,但简单来说,您将ARRAY_CONTAINS的参数从后到前:

WITH t1(id, name, ids_array) AS (
    SELECT column1, column2, SPLIT(column3,',') FROM VALUES
        (1, 'A-123', '1,2')
), t2(id, name) AS (
    SELECT column1, column2 FROM VALUES
        (1, 'test'),     
        (2, 'test2')
)
SELECT t1.id
    ,t2.name
    ,t2.id
    ,t1.ids_array
    ,ARRAY_CONTAINS('1'::variant, t1.ids_array) as const_1
    ,ARRAY_CONTAINS('2'::variant, t1.ids_array) as const_2
    ,t2.id::text::variant as v1
    ,ARRAY_CONTAINS(v1, t1.ids_array) as it_works
FROM t1, t2 
Run Code Online (Sandbox Code Playgroud)

给出:

ID 姓名 ID IDS_ARRAY 常量_1 常量_2 V1 有用
1 测试 1 [“1”,“2”] 真的 真的 “1” 真的
1 测试2 2 [“1”,“2”] 真的 真的 “2” 真的

所以现在使用正确的形式:

WITH t1(id, name, ids_array) AS (
    SELECT column1, column2, SPLIT(column3,',') FROM VALUES
        (1, 'A-123', '1,2')
), t2(id, name) AS (
    SELECT column1, column2 FROM VALUES
        (1, 'test'),     
        (2, 'test2')
)
SELECT t1.id
    ,t2.name
FROM t1, t2 
WHERE ARRAY_CONTAINS(t2.id::text::variant, t1.ids_array)
Run Code Online (Sandbox Code Playgroud)

我们得到:

ID 姓名
1 测试
1 测试2