Как программно создать запрос Snow SQL - PullRequest
0 голосов
/ 15 января 2020

Я новичок в 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 

Есть ли способ добиться этого в Snow SQL (SnowFlake)?

1 Ответ

1 голос
/ 15 января 2020

Конечно, можно создавать динамические c SQL в SnowFlake. Наиболее распространенным способом является использование хранимых процедур и / или пользовательских функций с использованием javascript для генерации SQL и его выполнения.

В javascript можно использовать замену строк, циклы и т. Д. c чтобы создать списки параметров, объедините условия и т.д. c.

Вот общая документация

и пара полезных 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

...