【问题标题】:How to create SnowSQL query programmatically如何以编程方式创建 SnowSQL 查询
【发布时间】:2020-03-05 23:49:52
【问题描述】:

我是 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。然后我想要由 UNION 分隔的 3 个查询,如下所示。

    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 ) 中实现这一点?

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 感谢大卫加里森。这帮助我实现了动态行为。
    猜你喜欢
    • 2022-08-21
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2013-03-10
    • 2013-11-15
    • 2013-12-28
    • 2011-02-10
    相关资源
    最近更新 更多