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

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

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

  1. create OR REPLACE function myTestFunc(tbl_name VARCHAR, Column_Name varchar, id VARCHAR)
  2. returns varchar
  3. as
  4. $$
  5. select Column_Name from tbl_name WHERE Column_Name=id
  6. $$
  7. ;

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

yk9xbfzb

yk9xbfzb1#

您可以使用支持snowflake对象的snowflake过程来执行动态查询。
https://docs.snowflake.com/en/sql-reference/stored-procedures-usage.html
如果表和列受到限制,可以使用以下方法:

  1. create OR REPLACE function myTestFunc(tbl_name VARCHAR, Column_Name varchar, id VARCHAR)
  2. returns number
  3. as
  4. $$
  5. select val1 from test WHERE col1 = id and ( Column_Name = 'col1' and tbl_name = 'test' )
  6. union all
  7. select val3 from woop WHERE col2 = id and ( Column_Name = 'col2' and tbl_name = 'woop' )
  8. $$
  9. ;
  10. select myTestFunc( 'test','col1','Jack' );
  11. select myTestFunc( 'woop','col2','Jack' );
z4bn682m

z4bn682m2#

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

7bsow1i6

7bsow1i63#

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

  1. CREATE OR REPLACE PROCEDURE MY_TEST_FUNC(TBL_NAME VARCHAR, COLUMN_NAME varchar, ID VARCHAR)
  2. RETURNS STRING
  3. LANGUAGE JAVASCRIPT
  4. AS
  5. $$
  6. var sql_command = "select " + COLUMN_NAME + " from " + TBL_NAME + " WHERE " + COLUMN_NAME + " = " + ID + "";
  7. try {
  8. var result_set = snowflake.execute ({sqlText: sql_command});
  9. while (result_set.next()) {
  10. v_col_name = result_set.getColumnValue(1);
  11. }
  12. return "Success::" + v_col_name; // Return a success/error indicator.
  13. }
  14. catch (err) {
  15. return "Failed: "+ sql_command + err; // Return a success/error indicator.
  16. }
  17. $$;

您可以这样调用函数:

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

谢谢

展开查看全部

相关问题