迫使Presto保持在哪里条款的顺序



我正在尝试运行类似以下查询的内容:

SELECT * FROM foo WHERE cardinality(bar) > 0 AND bar[1] = '...';

但是,我得到了Query failed: Array subscript out of bounds。我假设这是因为Presto试图通过在检查cardinality(bar) > 0之前检查bar[1] = '...'来优化查询。有没有办法强制Presto维持条款的顺序?

我需要两种方式解决了这个问题。

  1. 使用element_at函数而不是[]订阅符号。 element_at在索引段的末端时返回零,因此您可以将示例简化为一个条件。element_at在Select子句中也有效,尽管您的Were子句不需要:
SELECT bar[1] FROM foo WHERE element_at(bar,1) = '...';
  1. 使用with子句在子查询中执行第一个条件:
WITH (SELECT * FROM foo WHERE cardinality(bar) > 0) AS populated_foo
SELECT * FROM populated_foo WHERE bar[1] = '...';

第二种方法对您的示例没有多大意义,但是我发现它对于涉及数组内部的行对象的更复杂条件很有用。

相关内容

  • 没有找到相关文章