You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在BigQuery存储过程中实现动态过滤条件?

如何在BigQuery存储过程中通过参数指定过滤条件?

完全可以通过新增参数来控制使用不同的过滤条件,具体实现方式如下:

  1. 添加控制参数:给存储过程新增一个condition参数(比如INT类型),用于接收用户选择的过滤规则标识。
  2. 动态拼接过滤逻辑:在动态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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:01:44