Netezza 不对 case 语句进行惰性求值?

Posted

技术标签:

【中文标题】Netezza 不对 case 语句进行惰性求值?【英文标题】:Netezza does not do lazy evaluation of case statements? 【发布时间】:2011-03-30 10:23:34 【问题描述】:

我正在执行一个可能包含除以 0 的计算,在这种情况下,我希望结果是任意值 (55)。令我惊讶的是,用 case 语句包装计算并没有完成这项工作!

select case when 1=0 then 3/0 else 55 end

错误 HY000:除以 0

这是为什么呢?还有其他解决方法吗?

【问题讨论】:

也许它会不断折叠。如果您尝试使用真实数据怎么办? (类似的事情发生在带有select case when 1=0 then LOG(0) else 55 end 的 SQL Server 中) 可能是这样 - 此失败是由于常量。我会发布真正的查询。 【参考方案1】:

好吧,我说的不准确。这是“除以 0”失败的确切查询:

select case when min(baba) = 0 then 55 else sum(1/baba) end from t group by baba

这看起来像是来自 Netezza 的惰性评估失败,请注意我按 baba 分组,所以每当 baba 为 0 时,也意味着 min(baba) 为 0,并且评估应该已经优雅地停止了达到1/baba 术语并在除以0 时失败。对吗?好吧,没有。

我猜这里的问题和失败的原因是 Netezza 在评估聚合项之前先评估行项。所以它必须在每一行评估1/babababa,然后才能评估聚合项min(baba)sum(1/baba)

所以,解决方法(对我来说)是:select case when min(baba) = 0 then 55 else 1/min(baba) end from t group by baba,含义相同。

【讨论】:

根据我对 Netezza 查询处理的理解,聚合是在 FPGA 上的可见性/限制引擎“之后”在主机上完成的。这将解释为什么您的查询失败,以及为什么您看到它在 rbr 基础上评估和处理行。从您在解决方法中编写查询的方式来看,您似乎将该处理移至 Netezza 的“主机”部分,在聚合之后应用。

以上是关于Netezza 不对 case 语句进行惰性求值?的主要内容,如果未能解决你的问题,请参考以下文章

Python惰性求值器

我们可以在 Netezza sql 中使用 switch case 吗?

惰性求值——lodash源码解读

Swift 之惰性求值

Python中的惰性求值

当参数是列表时,惰性求值如何工作?