Snowflake JavaScript程序如何从不在阶段的对象中更新字段?

Posted

技术标签:

【中文标题】Snowflake JavaScript程序如何从不在阶段的对象中更新字段?【英文标题】:Snowflake JavaScript procedure how to update a field from an object that is not in a stage? 【发布时间】:2021-03-15 13:08:20 【问题描述】:

我正在尝试在 Snowflake 上执行一个 javascript 过程,以使用 JavaScript 数组中的相关值更新表。

假设我有下表:

还有这个数组:

var arr = "gender_value": "Gender", "age_range": "Age Range"

所以我更新表格的最终结果是:

我尝试了类似的方法:

var query = "
    MERGE INTO mytable m
    USING (SELECT * FROM "+arr+" )
";

但我认为如果对象不在舞台中,则不可能从对象中进行 SELECT。

【问题讨论】:

【参考方案1】:

您将不得不在 SQL 中解析您的数组以获取 MERGE 的结构。另一种选择是将数组存储在临时表中。但我没有看到任何问题让这个工作,看我的例子:

create or replace table so_test
(
question_name varchar
,answer varchar
,question_label varchar
);

insert into so_test values ('gender_value','Female',null),('age_range','>60',null);

merge into so_test
using 
(
select 
g.key as join_key
,g.value as join_value
from  
(
select parse_json(column1) as arr from values ('"gender_value": "Gender", "age_range": "Age Range"') 
) x,
lateral flatten(input => x.arr) g
)src
on so_test.question_name = src.join_key
when matched then update
set question_label = src.join_value;

--proc example
CREATE OR REPLACE PROCEDURE "ARRAY_TEST_SP"(sp_input varchar)
RETURNS VARCHAR(16777216)
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS 
$$
var v_array = SP_INPUT;
var v_merge = `merge into so_test
using 
(
select 
g.key as join_key
,g.value as join_value
from  
(
select parse_json(column1) as arr from values (?) 
) x,
lateral flatten(input => x.arr) g
)src
on so_test.question_name = src.join_key
when matched then update
set question_label = src.join_value;`;
var v_stmt = snowflake.createStatement( 
  
  sqlText:  v_merge,
  binds:[v_array] 
  
);
try 
        v_stmt.execute()
        return "Succeeded.";   // Return a success/error indicator.
        
    catch (err)  
        return "Failed: " + err;   // Return a success/error indicator.
        
$$;

call ARRAY_TEST_SP('"gender_value": "Gender", "age_range": "Age Range"');  

【讨论】:

以上是关于Snowflake JavaScript程序如何从不在阶段的对象中更新字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Snowflake Javascript 存储过程或函数遍历表中的所有列?

将存储过程从 Teradata BTEQ 迁移到 Snowflake

在我们将其解析为 JSON 之前,Snowflake 如何转义对象数组字符串中的所有特殊字符?

如何从 SnowFlake 中的 JSON 字符串解析特定数据?

从 Azure Function App 调用 Snowflake 过程

如何从 Snowflake Stage 加载大型 JSON 文件?