在Snowflake中运行以下查询显然会产生Division by zero
错误:
SELECT 1 / 0;
然而,一些派生查询并不总是产生错误。例如,此查询只返回1
:
SELECT COUNT(*)
FROM (SELECT 1 / 0);
据我所知,这是由于Snowflake中的懒惰评估或其他编译器优化造成的。由于Snowflake已经知道最终输出(行数(,因此永远不会执行除法。
然而,在实际的用例中,这可以有效地隐藏错误,例如在使用DBT运行数据测试时(因为DBT执行器会自动使用SELECT COUNT(*) FROM (...)
.包装测试查询(
我可以强制Snowflake执行查询的每一部分,或者以某种方式跳过懒惰的评估/编译器优化吗
编辑:除以零只是一个简化的例子。还有许多其他事情可能会导致错误——有时是明确的,比如断言。
事实证明,解决方案非常简单!只需添加一个针对所需部分的条件语句,Snowflake将被迫执行该部分以评估条件。
例如,此查询将再次产生Division by zero
错误:
SELECT COUNT(*)
FROM (
SELECT (1 / 0) AS n
WHERE n IS NOT NULL
);