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

xwbd5t1u  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(423)

我正在用雪花写下面的函数。

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
  $$
  ;

如何传递表和列名作为输入参数,并在查询中使用这些参数作为表和列名。在这里,参数被视为字符串文本,而不是表或列名。是否有任何方法可以在用户定义的函数中实现这一点。
谢谢

yk9xbfzb

yk9xbfzb1#

您可以使用支持snowflake对象的snowflake过程来执行动态查询。
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' );
z4bn682m

z4bn682m2#

关于snowflake udf,有一件基本的事情需要您了解,以便正确设置您的期望值—它实际上不是编程语言意义上的函数,而是更像一段sql代码,在执行sql时展开。因此,在运行sql时,所有使用的udf都会被实际代码替换,然后运行。
这给使用udf可以做什么和不能做什么带来了一些限制,从这个Angular 看udf时,动态查询是没有意义的事情之一。
正如gokhan在上面所说的,使用动态查询的正确方法是snowflake过程

7bsow1i6

7bsow1i63#

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

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

谢谢

相关问题