我正在尝试运行类似以下查询的内容:
SELECT * FROM foo WHERE cardinality(bar) > 0 AND bar[1] = '...';
但是,我得到了Query failed: Array subscript out of bounds
。我假设这是因为Presto试图通过在检查cardinality(bar) > 0
之前检查bar[1] = '...'
来优化查询。有没有办法强制Presto维持条款的顺序?
我需要两种方式解决了这个问题。
- 使用
element_at
函数而不是[]订阅符号。element_at
在索引段的末端时返回零,因此您可以将示例简化为一个条件。element_at
在Select子句中也有效,尽管您的Were子句不需要:
SELECT bar[1] FROM foo WHERE element_at(bar,1) = '...';
- 使用
with
子句在子查询中执行第一个条件:
WITH (SELECT * FROM foo WHERE cardinality(bar) > 0) AS populated_foo
SELECT * FROM populated_foo WHERE bar[1] = '...';
第二种方法对您的示例没有多大意义,但是我发现它对于涉及数组内部的行对象的更复杂条件很有用。