如何以编程方式创建 SnowSQL 查询
How to create SnowSQL query programmatically
我是 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 ) 中实现这一点?
当然可以在 SnowFlake 中创建动态 SQL。最常见的方法是使用存储过程 and/or UDF 使用 javascript 生成 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
我是 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 ) 中实现这一点?
当然可以在 SnowFlake 中创建动态 SQL。最常见的方法是使用存储过程 and/or UDF 使用 javascript 生成 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