【问题标题】:Force Presto to maintain order of WHERE clauses强制 Presto 保持 WHERE 子句的顺序
【发布时间】:2017-11-26 10:14:33
【问题描述】:

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

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

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

【问题讨论】:

  • SQL 不是短路的。如果您需要特定的评估顺序,可以使用ifcase。在您的特定情况下,下面的答案完全有道理。

标签: sql hadoop presto


【解决方案1】:

当我需要它时,我通过两种方式解决了这个问题。

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

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

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 2012-12-17
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多