如何在BigQuery存储过程中实现动态过滤条件?
如何在BigQuery存储过程中通过参数指定过滤条件?
完全可以通过新增参数来控制使用不同的过滤条件,具体实现方式如下:
- 添加控制参数:给存储过程新增一个
condition参数(比如INT类型),用于接收用户选择的过滤规则标识。 - 动态拼接过滤逻辑:在动态SQL中,根据
condition的取值,选择对应的过滤条件片段。借助BigQuery的FORMAT函数安全生成SQL语句,避免直接字符串拼接带来的风险。
以下是修改后的完整存储过程代码:
CREATE OR REPLACE PROCEDURE `peterwu.UDP_mem_profile_package` ( table_name STRING, title_name STRING, status_start_dt DATE, status_end_dt DATE, condition INT -- 新增的过滤控制参数 ) BEGIN -- 插入数据 EXECUTE IMMEDIATE FORMAT(""" INSERT INTO `peterwu.UDP_OUTPUT_mem_profile_aggregated` (TITLE, GROUP_ORDER, GROUP_ID1, GROUP_NAME, MEM_CNT, TKT, SALES) SELECT @title_name, 5, COUNT(DISTINCT MEM_ID) AS MEM_CNT, COUNT(DISTINCT CASE WHEN IS_TICKET = 1 THEN TKT_NO END) AS TICKET, SUM(retail_price_amt) AS SALES FROM `peterwu.tlw_txn_since_2017` WHERE TRANS_DT BETWEEN @start_dt AND @end_dt AND MEM_ID IN (SELECT MEM_ID FROM `%s`) %s """, table_name, -- 根据condition参数切换过滤条件 IF(condition = 1, "AND (SITE_ID BETWEEN '1A01' AND '1A02' OR SITE_ID BETWEEN '1A03' AND '1A04')", "AND (SITE_ID BETWEEN '1S01' AND '1S02' OR SITE_ID BETWEEN '1S03' AND '1S04')" ) ) USING status_start_dt AS start_dt, status_end_dt AS end_dt, title_name AS title_name; END;
关键说明:
- 传入
condition=1时,存储过程会使用过滤条件1;传入其他值时,自动切换为过滤条件2。 - 用
FORMAT函数拼接表名和过滤条件,比直接字符串拼接更安全,能有效避免SQL注入问题。 - 通过
IF函数动态生成WHERE子句的过滤片段,实现不同规则的灵活切换。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

