Можно ли выйти из оператора сокращения в presto?

Интересно, можно ли выйти из оператора сокращения в престо. Пример использования:

У меня есть таблица, в которой один столбец представляет собой массив bigints, и я хочу вернуть все столбцы, в которых величина массива меньше, чем, скажем, 1000. Поэтому я мог бы написать

select 
* 
from table 
where reduce(array_col, 0, (s,x) -> s + power(x,2), s -> if(s < power(1000,2), TRUE, FALSE))

но если строк много, а массивы большие, это может занять некоторое время. Я хотел бы, чтобы оператор сломался и вернул FALSE, как только сумма превысит 1000. В настоящее время у меня есть:

select 
* 
from table 
where reduce(array_col, 0, if(s >= power(1000,2), power(1000,2), s + power(x,2), s -> if(s < power(1000,2), TRUE, FALSE))

который, по крайней мере, экономит некоторые вычисления, как только сумма превышает целевое значение, но все же должен выполнять итерацию по каждому элементу массива.


person Cry Wolf    schedule 09.01.2019    source источник


Ответы (1)


Нет поддержки «перерыва» из сокращения массива.

Примечание: технически вы можете попытаться взломать это, сгенерировав сбой (например, 1/0), когда вам нужен перерыв, и поймать его с помощью try. Хотя сомневаюсь, что оно того стоит.

person Piotr Findeisen    schedule 10.01.2019