如何在雪花用户定义的函数中编写动态查询

时间:2020-06-16 08:04:44

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

我正在雪花中编写以下函数。

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 :(得分:0)

您可以使用支持雪花对象的Snowflake PROCEDURE来执行动态查询。

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' );

答案 1 :(得分:0)

您需要了解有关Snowflake UDF的基本知识,以便正确设置期望-它实际上不是编程语言意义上的函数,而更像是一段SQL代码,在执行SQL时就已解开。因此,在您运行SQL的那一刻,那里使用的所有UDF都将替换为其实际代码,然后运行。

这对使用UDF可以做和不能做的事情施加了一些限制,而从这种角度看UDF时,动态查询是没有意义的事情之一。

正如Gokhan所说,动态查询的正确方法是Snowflake过程

答案 2 :(得分:0)

这是使查询动态化的一种方法。我测试了它,它正在工作。

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');

谢谢