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/baba
和baba
,然后才能评估聚合项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 语句进行惰性求值?的主要内容,如果未能解决你的问题,请参考以下文章