如何确保BigQuery CASE语句按顺序迭代校验所有WHEN子句后再执行ELSE分支
解决CASE语句未按顺序校验WHEN子句的问题
首先得澄清一个关键知识点:标准SQL里的CASE语句本来就是按顺序逐个检查WHEN子句的,一旦找到第一个满足条件的分支就返回结果(短路求值),不会再继续往下校验。你遇到的问题本质是原语句的逻辑结构有漏洞,导致分支触发时机不符合你的预期。
看你的原语句,前三个WHEN都依赖st.skuprc_cost = 0这个核心前提,但第四个WHEN没有包含这个条件。这就导致:
- 如果
st.skuprc_cost != 0,前三个WHEN直接跳过,第四个WHEN的条件(三个成本字段都为NULL)也大概率不满足,直接走到ELSE返回原值; - 如果
st.skuprc_cost = 0但前三个WHEN都不满足,第四个WHEN的条件不一定成立,最终还是会走到ELSE返回st.skuprc_cost(也就是0),但你可能误以为没有触发第四个WHEN的校验。
根据你的需求——在执行ELSE前完成所有WHEN的逐个排查,调整后的语句应该把st.skuprc_cost = 0作为外层判断,内层再依次校验三个分支,这样能严格保证顺序校验的逻辑:
SELECT CASE -- 先判断核心前提:当成本为0时,进入分支逐个校验所有WHEN条件 WHEN st.skuprc_cost = 0 THEN CASE WHEN (st.br_cde = bsv.br_cde AND st.sku_cde = bsv.sku_cde) THEN bsv.skul_cost WHEN (b.ctry_cde = csv.ctry_cde AND st.sku_cde = csv.sku_cde) THEN csv.skul_cost WHEN (st.sku_cde = gsv.sku_cde) THEN gsv.skul_cost -- 前三个WHEN都不满足时,返回0 ELSE 0 END -- 成本不为0时,直接返回原值 ELSE st.skuprc_cost END AS skuprc_cost
调整后的逻辑流程清晰可控:
- 先检查
st.skuprc_cost是否为0; - 如果是,按顺序逐个校验前三个WHEN条件,找到第一个满足的就返回对应成本值;
- 前三个都不满足的话,返回0;
- 如果
st.skuprc_cost不为0,直接返回原值,不会触发任何内层分支。
如果你确实需要保留第四个WHEN的“三个成本都为NULL”判断,也可以把它加到内层CASE的最后:
SELECT CASE WHEN st.skuprc_cost = 0 THEN CASE WHEN (st.br_cde = bsv.br_cde AND st.sku_cde = bsv.sku_cde) THEN bsv.skul_cost WHEN (b.ctry_cde = csv.ctry_cde AND st.sku_cde = csv.sku_cde) THEN csv.skul_cost WHEN (st.sku_cde = gsv.sku_cde) THEN gsv.skul_cost WHEN (bsv.skul_cost IS NULL AND csv.skul_cost IS NULL AND gsv.skul_cost IS NULL) THEN 0 ELSE st.skuprc_cost -- 此时st.skuprc_cost为0,和返回0效果一致 END ELSE st.skuprc_cost END AS skuprc_cost
内容的提问来源于stack exchange,提问作者Mengezi Dhlomo
相关产品推荐
相关产品推荐

