【问题标题】:Parameterization in Snowflake UDFSnowflake UDF 中的参数化
【发布时间】:2021-08-10 05:29:05
【问题描述】:

我目前正在尝试重构 Snowflake 中的一些 SQL 逻辑,以提高可读性并通过使用 UDF 减少重复代码。

这是我要创建的 UDF:

create or replace function myfunc(var1 varchar, var2 varchar)
returns table (result int)
as 
$$
select var1 from table1
where var2 = 1
$$;

select * from table(myfunc(column1, column2));

我希望 var1var2 成为 table1 中的两个列名,但不确定如何在 SQL/Snowflake UDF 中执行此操作。

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    Snowflake 允许使用IDENTIFIER 和变量来实现类似的效果:

     SET (VAR1, VAR2) = ('my_col1', 'my_col2');
     
     SELECT IDENTIFIER($VAR1)
     FROM table_name
     WHERE IDENTIFIER($VAR2) = 1;
    

    但是,这种语法不能用 UDTF 包装。可以使用动态 SQL(存储过程)来参数化列列表/表名。


    旁注:问题中使用的模式:

    select * from table(myfunc(column1, column2));
    

    被称为多态表函数(PTF),定义在 ISO/IEC TR 19075-7:2017 Information technology — Database languages — SQL Technical Reports — Part 7: Polymorphic table functions in SQL

    它允许在运行时塑造结果的结构并提供更大的灵活性。一个例子可以是SELECT * EXCEPT

    【讨论】:

      【解决方案2】:

      根据this,这在UDF 中是不可能的,并且Snowflake UDF docs 中除了普通(即非动态)SQL 之外没有示例。

      但如果您愿意,它可能作为存储过程的。 Snowflake docs 有语法示例(和tips/warnings 关于 SQL 注入)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 2022-11-29
        • 2021-09-30
        • 2020-03-17
        • 2022-12-15
        • 2020-11-29
        相关资源
        最近更新 更多