Sql BigQuery中被0除的错误,即使在短路时也应防止该错误

Sql BigQuery中被0除的错误,即使在短路时也应防止该错误,sql,google-bigquery,Sql,Google Bigquery,在我的数据中,fulfillment\u ratio字段可能等于或不等于0。我不明白为什么我仍然得到0除错误。我以为我是在使用IF语句短路,以便在给定组存在0时不会进行计算 选择 订购钥匙, 订单来源:, 销售商品密钥作为密钥, 任何作为名称的价值(销售项目名称), 作为sku的任何价值(销售项目.sku), 任何价值(销售项目数量)*最小值(完成率)作为数量计算, 最小值(销售项目基本价格)作为价格, 如果(计数如果(完成率=0)>0,0,总和(cogs/完成率)*最小值(完成率))作为销售商

在我的数据中,
fulfillment\u ratio
字段可能等于或不等于0。我不明白为什么我仍然得到0除错误。我以为我是在使用
IF
语句短路,以便在给定组存在0时不会进行计算

选择
订购钥匙,
订单来源:,
销售商品密钥作为密钥,
任何作为名称的价值(销售项目名称),
作为sku的任何价值(销售项目.sku),
任何价值(销售项目数量)*最小值(完成率)作为数量计算,
最小值(销售项目基本价格)作为价格,
如果(计数如果(完成率=0)>0,0,总和(cogs/完成率)*最小值(完成率))作为销售商品的成本
从…起
订购\产品\库存\项目
分组
订购钥匙,
订单来源:,
销售商品。密钥

正如您在选择列表的最后一行中所看到的,我正在计算是否存在
fulfillment\u ratio=0
的情况,如果存在,我的印象是将返回
0
,并且不会评估假条件。但是,我仍然得到一个0除的错误。这怎么可能?有更好的方法吗?

您可以使用
NULLIF

COALESCE(SUM(cogs / NULLIF(fulfillment_ratio,0)) * MIN(fulfillment_ratio),0)

谢谢,我会试试的。但是你知道为什么我的方法不起作用吗?文档说明,如果表达式为true,则不会计算false条件。我错过了什么?@flyingL123。不能保证使用
if()
短路。它应该与
case
@GordonLinoff一起工作,文档说:“如果cond为true,则返回true\u结果,否则返回else\u结果。如果cond为true,则不计算else\u结果。如果cond为false或NULL,则不计算true\u结果。true\u结果和else\u结果必须强制为公共超类型。”“条件表达式对其输入的求值顺序施加约束。本质上,它们是通过短路从左到右进行评估的,并且只评估所选的输出值。“即使使用case语句,我也会得到相同的错误。这个
COUNTIF(fulfillment\u ratio=0)是否存在某种问题>0
?可能它没有执行我认为它正在执行的操作?短路对某些复杂的表达式不起作用。请尝试安全分割。