有关在Snowflake中的函数内部嵌套多个函数的问题

时间:2019-10-21 17:07:18

标签: snowflake-data-warehouse

(代表雪花用户提交...)


问题:

是否可以在一个函数中嵌套多个函数并传递所需的所有参数?

例如...

CREATE OR REPLACE FUNCTION "udf_InteractionIndicator"("ROH_RENEWAL_SYSTEM_STATUS1" VARCHAR(100), "GOLS_OPPORTUNITY_LINE_STATUS" VARCHAR(100)

                            , "ROH_CLIENT_CURRENT_TEMPERATURE1" VARCHAR(100)

                            , "ROH_PO_ATTACHED" VARCHAR(100)

                            , "ROH_PO_NUMBER" VARCHAR(100)

                            , "RT_PAID_OVERRIDE" VARCHAR(100), "ROH_RENEWAL_OPPORTUNITY_STATUS1" VARCHAR(100)

                            , "ROH_RENEWAL_CONVERSATION_DATE" DATE, "ROH_APPROVAL_RECEIVED_DATE" DATETIME)

 RETURNS NUMBER(1,0)

 AS

 $$

  CASE WHEN ("udf_RenewalNoticeSentIndicator"("ROH_RENEWAL_SYSTEM_STATUS1", "ROH_CLIENT_CURRENT_TEMPERATURE1"

                              , "GOLS_OPPORTUNITY_LINE_STATUS"

                              , "ROH_PO_ATTACHED", "RT_PAID_OVERRIDE"

                              , "ROH_RENEWAL_OPPORTUNITY_STATUS1")) = 1

      AND (ROH_RENEWAL_CONVERSATION_DATE IS NOT NULL

        OR ("udf_AuthorizedIndicator"(ROH_APPROVAL_RECEIVED_DATE, "ROH_PO_ATTACHED", "ROH_PO_NUMBER")) = 1

        OR ("udf_PaidIndicator"("GOLS_OPPORTUNITY_LINE_STATUS")) = 1

        OR ("udf_ChurnIndicator"("GOLS_OPPORTUNITY_LINE_STATUS")) = 1

        )

   THEN 1 ELSE 0 END

 $$

 ;

我已经收到推荐给:

  

...创建一个SQL UDF或JavaScript UDF。 JavaScript UDF只能   包含JavaScript代码,并且一个SQL UDF只能包含一个SQL   语句(无DML和DDL)。在嵌套的情况下,SQL UDF可以调用   另一个SQL UDF或JavaScript UDF,但事实并非如此。   JavaScript UDF(仅包含JavaScript代码)。

   CREATE OR REPLACE FUNCTION udf_InteractionIndicator_nested(ID DOUBLE)
     RETURNS DOUBLE
     AS
     $$
      SELECT ID
     $$;




create or replace function js_factorial(d double)
  returns double
  language javascript
  strict
  as '
  if (D <= 0) {
    return 1;
  } else {
    var result = 1;
    for (var i = 2; i <= D; i++) {
      result = result * i;
    }
    return result;
  }
  ';

CREATE OR REPLACE FUNCTION udf_InteractionIndicator(ID DOUBLE)
 RETURNS double
 AS
 $$
  select udf_InteractionIndicator_nested(ID) + js_factorial(ID)
 $$;

 select udf_InteractionIndicator(4);
+-----------------------------+
| UDF_INTERACTIONINDICATOR(4) |
|-----------------------------|
|                          28 |
+-----------------------------+

但是,我正在尝试使用SQL UDF完成此操作。只要嵌套函数使用相同的参数,就可以创建嵌套函数。我想创建一个接受8个参数的函数,而基础函数可以引用全部,部分或不引用任何父函数参数。那是我遇到的问题...思考?

1 个答案:

答案 0 :(得分:1)

(我们社区的一名顾问提供了以下答案...)


如果您的用例是有一个“主”功能将工作分解为子功能,而子功能只能从main调用,那么使用JavaScript UDF的设计将更加紧凑和易于维护。

然后,您只需在main函数中定义所有基础函数,这可以通过JavaScript而不是SQL UDF来实现,然后您可以在任何地方自由使用main参数。

CREATE OR REPLACE FUNCTION MAIN_JS(P1 STRING, P2 FLOAT)
RETURNS FLOAT
LANGUAGE JAVASCRIPT
AS '
    function helper_1(p) { return p * 2;  }
    function helper_2(p) { return p == "triple" ? P2 * 3 : P2; }

    return helper_1(P2) + helper_2(P1);
';

SELECT MAIN_JS('triple', 4);  -- => 20