在 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>;
在下面的查询中,我使用存储过程从 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>; |