强制Presto维护WHERE子句的顺序

时间:2017-06-23 00:10:48

标签: sql hadoop presto

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

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

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

1 个答案:

答案 0 :(得分:2)

当我需要它时,我已经用两种方式解决了这个问题。

  1. 使用the element_at function代替[]下标表示法。索引经过数组末尾时,element_at返回NULL,因此您可以将示例缩减为一个条件。 element_at也适用于SELECT子句,尽管WHERE子句不需要它:
  2. SELECT bar[1] FROM foo WHERE element_at(bar,1) = '...';
    
    1. 使用the with clause
    2. 在子查询中执行第一个条件
      WITH (SELECT * FROM foo WHERE cardinality(bar) > 0) AS populated_foo
      SELECT * FROM populated_foo WHERE bar[1] = '...';
      

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

相关问题