在 Snowflake 脚本存储过程的查询条件中使用变量

Using Variables in Query Criteria in a Snowflake Scripting Stored Procedure

在下面的查询中,我使用存储过程从 source_tbl 创建 table output_tbl_name。 output_tbl_name 的名称带有今天日期的时间戳。

DECLARE
   creation_date   STRING := to_varchar(current_date(), 'YYYYMMDD');
   output_tbl_name STRING := concat('my_database.my_schema.', 'output_', :creation_date);
   QUERY           STRING;
BEGIN

   QUERY:= REPLACE(          
         'create or replace table <output_tbl_name>(col1 varchar, col2 varchar) as 
select * from source_tbl;'
         ,'<output_tbl_name>', :output_tbl_name);         ;    

   EXECUTE IMMEDIATE :QUERY;
   
   RETURN :QUERY;
END;

但是,我想为复制过来的数据设置一个动态标准。例如,source_tbl 有一个日期列,我只想复制日期 > 6 个月前的记录:

declare start_date date := add_months(current_date(), -6) 
create or replace output_tbl_name as select * from source_tbl where date > <start_date>

如何将其合并到我的上述查询中?将它直接放入我的 BEGIN 语句中的 QUERY 是行不通的。感谢您的帮助!

创建源数据table:

CREATE OR REPLACE TABLE tmp_table(col1 string);
DECLARE
   creation_date   STRING := to_varchar(current_date(), 'YYYYMMDD');
   output_tbl_name STRING := concat('my_database.my_schema.', 'output_', :creation_date);
   QUERY           STRING;
   source_tbl STRING := 'TMP_TABLE';
BEGIN
  LET date_present := false;
  
  SELECT true INTO :date_present FROM INFORMATION_SCHEMA.columns WHERE table_name = :source_tbl AND column_name = 'DATE';
    
   if (date_present = true) then
       QUERY := 'create or replace table <output_tbl_name>(col1 varchar, col2 varchar) as select * from source_tbl where date > <start_date>;';
             
    ELSE 
       QUERY:= 'create or replace table <output_tbl_name>(col1 varchar, col2 varchar) as select * from source_tbl;';    
    END IF;
    
     QUERY:= REPLACE( QUERY, '<output_tbl_name>', :output_tbl_name);      
   --EXECUTE IMMEDIATE :QUERY;
   
   RETURN :QUERY;
END;

begin
  let count := true;
  if (count = true) then
    return 'negative value';
  elseif (count = 0) then
    return 'zero';
  else
    return 'positive value';
  end if;
end;
anonymous block
create or replace table my_database.my_schema.output_20220307(col1 varchar, col2 varchar) as select * from source_tbl;

输入日期列:

CREATE OR REPLACE TABLE tmp_table(col1 string, date timestamp);
anonymous block
create or replace table my_database.my_schema.output_20220307(col1 varchar, col2 varchar) as select * from source_tbl where date > <start_date>;