2017-06-23 67 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] = '...'; 
    

    第二種方法對您的示例沒有太大意義,但我發現它適用於涉及數組內部的行對象的更復雜的條件。