Как писать запросы Dynami c в пользовательских функциях Snowflake - PullRequest
0 голосов
/ 16 июня 2020

Я пишу функцию ниже в виде снежинки.

create OR REPLACE function myTestFunc(tbl_name VARCHAR,  Column_Name varchar, id VARCHAR)
  returns varchar
  as
  $$
  select Column_Name from tbl_name WHERE Column_Name=id
  $$
  ;

Как передать имена таблиц и столбцов в качестве входных параметров и использовать эти параметры в качестве имен таблиц и столбцов в запросе. Здесь параметры обрабатываются как строковые литералы, но не как имя таблицы или столбца. Есть ли способ добиться этого в пользовательских функциях.

Спасибо

Ответы [ 3 ]

0 голосов
/ 16 июня 2020

Есть одна основная c вещь, которую вам нужно понять о пользовательских функциях Snowflake, чтобы оправдать ваши ожидания - это не совсем функция в смысле языка программирования, а больше похоже на фрагмент кода SQL, развернутый в точка SQL выполняется. Итак, в момент запуска ваш SQL все используемые UDF заменяются их фактическим кодом, а затем он запускается.

Это накладывает некоторые ограничения на то, что можно, а что нельзя делать с использованием UDF и динамического c запросы - одна из вещей, которые не имеют смысла, когда вы смотрите на UDF с этой точки зрения. *

0 голосов
/ 16 июня 2020

Это способ, которым вы можете сделать ваш запрос динамическим c. Я протестировал его, и он работает.

CREATE OR REPLACE PROCEDURE MY_TEST_FUNC(TBL_NAME VARCHAR,  COLUMN_NAME varchar, ID VARCHAR)
RETURNS STRING  
LANGUAGE JAVASCRIPT
AS
$$
var sql_command = "select " + COLUMN_NAME + " from " + TBL_NAME + " WHERE " + COLUMN_NAME + " = " + ID + ""; 
    try {
        var result_set = snowflake.execute ({sqlText: sql_command});
        while (result_set.next())  {
        v_col_name = result_set.getColumnValue(1);
        }
        return "Success::" + v_col_name;   // Return a success/error indicator.
        }
    catch (err)  {
        return "Failed: "+ sql_command + err;   // Return a success/error indicator.
        }
$$;

Вы можете вызвать функцию так:

CALL MY_TEST_FUNC('DB_NAME.SCHEMA_NAME.TABLE_NAME', 'COLUMN_NAME', 'ID_VALUE');

Спасибо

0 голосов
/ 16 июня 2020

Вы можете использовать Snowflake PROCEDURE, которая поддерживает объект снежинки для выполнения динамических c запросов.

https://docs.snowflake.com/en/sql-reference/stored-procedures-usage.html

Если таблицы и столбцы ограничены, вы можете использовать этот подход:

create OR REPLACE function myTestFunc(tbl_name VARCHAR,  Column_Name varchar, id VARCHAR)
returns number
as
$$
select val1 from test WHERE col1 = id and ( Column_Name = 'col1' and tbl_name = 'test' )
union all
select val3 from woop WHERE col2 = id and ( Column_Name = 'col2' and tbl_name = 'woop' )  
$$
;

select myTestFunc( 'test','col1','Jack' );

select myTestFunc( 'woop','col2','Jack' );
...