我正在雪花中编写以下函数。
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
$$
;
如何将表名和列名作为输入参数传递,以及如何在查询中将这些参数用作表名和列名。在这里,参数被视为字符串文字,而不是表或列名称。在用户定义的函数中有什么方法可以实现这一目标。
谢谢
答案 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');
谢谢