如何以编程方式创建SnowSQL查询

时间:2020-01-15 07:24:09

标签: dynamic-sql snowflake-cloud-data-platform snowsql

我是SnowFlake的新手,每天都在探索新事物。我坚持下面的情况。

    SELECT 
   '{COL}' AS field_name,
    a.{COL}AS old_value,
    b.{COL}AS new_value FROM A JOIN B ON(...)
    WHERE a.{COL} != b.{COL}

我想参数化COL。并且它可能具有多个值,例如 COL = col1,col2,col3 。然后我要3个查询,用 UNION 分开,如下所示。

    SELECT 
   'col1' AS field_name,
    a.col1 AS old_value,
    b.col1 AS new_value FROM A JOIN B ON(...)
    WHERE a.col1  != b.col1 

    UNION ALL

    SELECT 
   'col2' AS field_name,
    a.col2 AS old_value,
    b.col2 AS new_value FROM A JOIN B ON(...)
    WHERE a.col2  != b.col2 

    UNION ALL

    SELECT 
   'col3' AS field_name,
    a.col3 AS old_value,
    b.col3 AS new_value FROM A JOIN B ON(...)
    WHERE a.col3  != b.col3 

在SnowSQL(SnowFlake)中有什么方法可以实现这一目标?

1 个答案:

答案 0 :(得分:1)

当然可以在SnowFlake中创建动态SQL。最常见的方法是使用存储过程和/或使用JavaScript的UDF生成SQL并执行它。

在javascript中,您可以使用字符串替换,循环等来创建参数列表,联接条件等。

Here's the general documentation

这是几个有用的javascript片段

//Set Up a multi-column Join Condition based on the columns in ColumnList
//Example output: "a.column1 = b.column1 AND a.column2 = b.column2"
ConditionArray = [];
ColumnList.forEach(function(column){
  conditionArray.push("a." + column+ " = " + "b." + column);
});
joinCondition = conditionArray.join(" AND ");


//Executing a script, and returning the output from a resultSet
//You can chain these calls for cleaner/shorter code
SQLQuery = "SELECT 1;"
SQLStatement = snowflake.createStatement({sqlText: SQLQuery });
SQLResultSet = SQL_Statement.execute();
SQLResultSet.next();
SQLResultSet.getColumnValue(1)

然后,您可以创建循环以执行多个类似的查询,或将它们与UNION组合在一起,然后执行该循环。

https://docs.snowflake.net/manuals/sql-reference/stored-procedures-overview.html

相关问题