首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >雪花雪花有条件中断IF,开关

雪花雪花有条件中断IF,开关
EN

Stack Overflow用户
提问于 2020-09-09 15:46:35
回答 2查看 1.2K关注 0票数 0

问题就在雪花雪地附近。并需要执行有条件检查,以查看是否已将ETL_Date插入到表中,以及是否已插入;退出存储的proc。否则,如果未插入日期,请继续插入数据,然后返回“成功”(零)并退出。任何帮助都将不胜感激。谢谢。

起点:到目前为止我所做的代码。

代码语言:javascript
复制
IF ((SELECT IFNULL(MAX(ETL_DATE),'1900-01-01') FROM DB.TABLES.test_20200909) > CURRENT_DATE() )
{RETURN 0; break;}
else insert into DB.TABLES.test_20200909 (ETL_DATE,INSERT_VALUE)
values(CURRENT_DATE(),1)

这给了我错误:SQL编译错误:语法错误第1行,位置0,意外的'IF'.

目标/结束游戏:必须将其放入存储的过程中。我到目前为止说的是:

代码语言:javascript
复制
CREATE or replace procedure   TABLE_DB.TABLES.test_20200909_1 ()
returns FLOAT
language javascript
as
$$

var test_1 =`IF ((SELECT MAX(ETL_DATE) FROM DB.TABLES.test_20200909) > CURRENT_DATE() )
{RETURN 0; break;}
else insert into DB.TABLES.test_20200909 (ETL_DATE,INSERT_VALUE)
values(CURRENT_DATE(),1)`;
var test_1_stmt =  snowflake.createStatement({sqlText: test_1});  
var test_1_res = test_1_stmt.execute();
return 0
$$
EN

回答 2

Stack Overflow用户

发布于 2020-09-09 18:20:34

如果您的目标是创建一个用于检查/管理负载的存储过程,我将创建一个类似于以下内容的存储过程:

代码语言:javascript
复制
create or replace procedure SP_CHECK_LOAD()
    RETURNS VARCHAR(256) NOT NULL
    LANGUAGE JAVASCRIPT
    EXECUTE AS CALLER
as $$    

function get_check_load()
{
    var v_out_check_load;
    rs = snowflake.execute ( { sqlText: `SELECT CASE WHEN MAX(ETL_DATE)>=CURRENT_DATE() THEN 0 ELSE 1 END AS CHECK_RESULT FROM DB.TABLES.test_20200909;` }  );
    if( rs.next())
    {
       v_out_check_load = rs.getColumnValue(1); // get check result
    }

    return v_out_check_load; 
}   
  
  var result = new String('Successfully Executed');
  var v_check = get_check_load();
  
  if ( v_check==1 )
  {
    //data not yet loaded -> load them
    try {
       
    var sql_command = `INSERT INTO DB.TABLES.test_20200909 (ETL_DATE,INSERT_VALUE) VALUES(CURRENT_DATE(),1)`;
 
    var stmt = snowflake.createStatement({sqlText: sql_command});
    var res = stmt.execute();  
    
    }
    catch (err) {
    result =  "Failed: Code: " + err.code + " | State: " + err.state;
    result += "\n  Message: " + err.message;
    result += "\nStack Trace:\n" + err.stackTraceTxt; 
    } 
 } // end if
 
 return result;

  $$;

请注意,我在check条件MAX(ETL_DATE)>=CURRENT_DATE()中使用了>=,而不仅仅像在示例中那样使用了>,因为在这种情况下,您将排除当前的日期加载。如果这不适合你的需要,就改变它。

票数 1
EN

Stack Overflow用户

发布于 2020-09-09 19:45:35

基于您所提到的,看起来您甚至不需要一个存储过程来完成这个任务。您可以使用合并匹配,这可能更容易设置。

并需要执行有条件检查,以查看是否已将ETL_Date插入到表中,以及是否已插入;退出存储的proc。否则,如果未插入日期,请继续插入数据,然后返回成功(0)

请看看下面是否是你想要达到的目标

代码语言:javascript
复制
CREATE OR REPLACE TABLE test_20200909(INSERT_VALUE NUMBER, ETL_DATE TIMESTAMP);
 
INSERT INTO TEST_20200909 VALUES(1, '2020-09-01 00:00:00.000');
INSERT INTO TEST_20200909 VALUES(1, '2020-09-02 00:00:00.000');
INSERT INTO TEST_20200909 VALUES(1, '2020-09-03 00:00:00.000');
INSERT INTO TEST_20200909 VALUES(1, '2020-09-04 00:00:00.000');
 
SELECT * FROM test_20200909;
 
MERGE INTO test_20200909 T
 USING(SELECT MAX(ETL_DATE) maxdate FROM test_20200909) S 
 ON S.maxdate=CURRENT_DATE()
 when NOT matched then 
  insert (INSERT_VALUE,ETL_DATE)  values (1, CURRENT_DATE());
  
SELECT * FROM test_20200909;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63815159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档