2017-06-23 32 views
0

我试图运行类似下面的查询命令:力普雷斯托保持的WHERE子句

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

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

+0

SQL不会短路。如果您需要特定评估订单,您可以使用“if”或“case”。在你的具体情况下,下面的答案是完全合理的。 – Haozhun

回答

1

我已经在两种需要的时候解决了这个问题。

  1. 使用the element_at function而不是[]下标表示法。 element_at在索引超过数组末尾时返回NULL,因此可以将示例缩减为一个条件。 element_at也适用SELECT子句中,虽然不能与你的WHERE子句需要:
SELECT bar[1] FROM foo WHERE element_at(bar,1) = '...'; 
  • 使用the with clause不要在子查询中的第一个条件:
  • WITH (SELECT * FROM foo WHERE cardinality(bar) > 0) AS populated_foo 
    SELECT * FROM populated_foo WHERE bar[1] = '...'; 
    

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