我正在尝试运行类似以下查询的内容:
SELECT * FROM foo WHERE cardinality(bar) > 0 AND bar[1] = '...';
但是,我得到了Query failed: Array subscript out of bounds
。我假设这是因为Presto在检查bar[1] = '...'
之前通过检查cardinality(bar) > 0
来尝试优化查询。有没有办法强制Presto维持条款的顺序?
答案 0 :(得分:2)
当我需要它时,我已经用两种方式解决了这个问题。
element_at
function代替[]下标表示法。索引经过数组末尾时,element_at
返回NULL,因此您可以将示例缩减为一个条件。 element_at
也适用于SELECT子句,尽管WHERE子句不需要它:SELECT bar[1] FROM foo WHERE element_at(bar,1) = '...';
with
clause:WITH (SELECT * FROM foo WHERE cardinality(bar) > 0) AS populated_foo
SELECT * FROM populated_foo WHERE bar[1] = '...';
第二种方法对你的例子没有多大意义,但我发现它对于涉及数组内部行对象的更复杂的条件很有用。