PostgreSQL "сквозная" агрегатная функция, которая использует другие агрегатные функции - PullRequest
0 голосов
/ 19 октября 2019

Есть ли способ создать агрегатную функцию PostgreSQL, которая может вызывать другие агрегатные функции, обрабатывать исключения и возвращать одно значение?

Этот запрос принимает набор геометрий, объединяет их вместе, проверяет,постоянная геометрия полностью в объединенном результате и возвращает true false. Проблема в том, что частое слияние вызывает исключение по разным причинам, поэтому мне нужно сделать запасной вариант, то есть функцию iferror() в стиле Excel, которая будет выполнять другую операцию, такую ​​как st_union() вместо st_collect(). Если это также не помогает, в идеале я должен выполнить итерацию по всем геометриям индивидуально, чтобы увидеть, соответствует ли какая-либо из них моему тесту.

SELECT ST_WITHIN(
               ST_GeomFromText('POLYGON((0 4096,0 0,4096 0,4096 4096,0 4096))', 3857),
               ST_COLLECT(geomtry)
           ) AS IsEmpty
FROM (select geomtry from ...) AS src;

Псевдокод:

FUNCTION test_is_empty(geometries: SET<geometry>)
  TRY:
    RETURN ST_WITHIN(
               ST_GeomFromText('POLYGON((0 4096,0 0,4096 0,4096 4096,0 4096))', 3857),
               ST_COLLECT(geometries));
  EXCEPT:
    TRY:
      RETURN ST_WITHIN(
                 ST_GeomFromText('POLYGON((0 4096,0 0,4096 0,4096 4096,0 4096))', 3857),
                 ST_UNION(geometries));
    EXCEPT:
      TRY:
        RETURN SELECT MAX(ST_WITHIN(
                   ST_GeomFromText('POLYGON((0 4096,0 0,4096 0,4096 4096,0 4096))', 3857),
                   individual_value))
               FROM geometries;
      EXCEPT:
        RETURN FALSE;
END
...