Create/Query 基于 BQ 中条件语句的不同表 SQL
Create/Query different tables based on conditional statement in BQ SQL
举例说明,假设我在 BigQuery 中有两个 tables,分别称为“fruits”和“vegetables”。
我想在开头有一个变量,让我可以更改目标 table 和源 table 的名称。类似于:
food_type = 'fruit';
然后基于此,查询将从匹配的table中拉取数据并将其存储在匹配的table中:
IF food_type = 'fruit'
THEN destination_table = 'round_fruits' AND source_table = 'fruits'
ELIF food_type = 'veg'
THEN destination_table = 'round_veg' AND source_table = 'vegetables';
CREATE TABLE `project.dataset`.destination_table AS
SELECT * FROM `project.dataset`.source_table
WHERE shape = 'round';
在这种情况下,我希望只需要在开头分配 food_type 并且在我想要 运行 此查询时不更改任何其他地方。我意识到 BQ SQL 中的 IF 语句不是这样工作的,但我希望这能说明我的观点和我想要完成的事情。
如果你想分配一次 food_type 值并想使用它,那么你可以尝试下面的代码 -
declare food_type string default 'fruit' ;
declare destination_table string;
declare source_table string;
IF food_type = 'fruit'
THEN set destination_table = 'round_fruits' ;
set source_table = 'fruits';
end if;
IF food_type = 'veg'
THEN set destination_table = 'round_veg' ;
set source_table = 'vegetables';
end if;
EXECUTE IMMEDIATE concat("CREATE TABLE `project.dataset`.",destination_table," AS SELECT * FROM `project.dataset`.",source_table
," WHERE shape = 'round'");
如果您想多次使用此查询,您可以在 Big Query 中创建一个包含所有条件的存储过程,并在需要时调用该存储过程 -
CREATE OR REPLACE PROCEDURE `project.dataset.conditional_store_proc_test`(food_type string)
begin
declare destination_table string;
declare source_table string;
IF food_type = 'fruit'
THEN set destination_table = 'round_fruits' ;
set source_table = 'fruits';
end if;
IF food_type = 'veg'
THEN set destination_table = 'round_veg' ;
set source_table = 'vegetables';
end if;
EXECUTE IMMEDIATE concat("CREATE TABLE `project.dataset`.",destination_table," AS SELECT * FROM `project.dataset`.",source_table
," WHERE shape = 'round'");
end;
然后你可以用值调用存储过程 -
DECLARE food_type STRING DEFAULT NULL;
set food_type='fruit';
CALL `project.dataset.conditional_store_proc_test`(food_type);
set food_type='veg';
CALL `project.dataset.conditional_store_proc_test`(food_type);
举例说明,假设我在 BigQuery 中有两个 tables,分别称为“fruits”和“vegetables”。
我想在开头有一个变量,让我可以更改目标 table 和源 table 的名称。类似于:
food_type = 'fruit';
然后基于此,查询将从匹配的table中拉取数据并将其存储在匹配的table中:
IF food_type = 'fruit'
THEN destination_table = 'round_fruits' AND source_table = 'fruits'
ELIF food_type = 'veg'
THEN destination_table = 'round_veg' AND source_table = 'vegetables';
CREATE TABLE `project.dataset`.destination_table AS
SELECT * FROM `project.dataset`.source_table
WHERE shape = 'round';
在这种情况下,我希望只需要在开头分配 food_type 并且在我想要 运行 此查询时不更改任何其他地方。我意识到 BQ SQL 中的 IF 语句不是这样工作的,但我希望这能说明我的观点和我想要完成的事情。
如果你想分配一次 food_type 值并想使用它,那么你可以尝试下面的代码 -
declare food_type string default 'fruit' ;
declare destination_table string;
declare source_table string;
IF food_type = 'fruit'
THEN set destination_table = 'round_fruits' ;
set source_table = 'fruits';
end if;
IF food_type = 'veg'
THEN set destination_table = 'round_veg' ;
set source_table = 'vegetables';
end if;
EXECUTE IMMEDIATE concat("CREATE TABLE `project.dataset`.",destination_table," AS SELECT * FROM `project.dataset`.",source_table
," WHERE shape = 'round'");
如果您想多次使用此查询,您可以在 Big Query 中创建一个包含所有条件的存储过程,并在需要时调用该存储过程 -
CREATE OR REPLACE PROCEDURE `project.dataset.conditional_store_proc_test`(food_type string)
begin
declare destination_table string;
declare source_table string;
IF food_type = 'fruit'
THEN set destination_table = 'round_fruits' ;
set source_table = 'fruits';
end if;
IF food_type = 'veg'
THEN set destination_table = 'round_veg' ;
set source_table = 'vegetables';
end if;
EXECUTE IMMEDIATE concat("CREATE TABLE `project.dataset`.",destination_table," AS SELECT * FROM `project.dataset`.",source_table
," WHERE shape = 'round'");
end;
然后你可以用值调用存储过程 -
DECLARE food_type STRING DEFAULT NULL;
set food_type='fruit';
CALL `project.dataset.conditional_store_proc_test`(food_type);
set food_type='veg';
CALL `project.dataset.conditional_store_proc_test`(food_type);