#sql #postgresql
#sql #postgresql
Вопрос:
Учитывая некоторый очень сложный и дорогостоящий результат SQL-запроса с двумя столбцами — некоторым сложным data
и логическим flag
значением, есть ли в PostgreSQL способ:
- Если в результате содержится ровно 1 строка, а
flag
столбец равенtrue
, результат должен быть пустым. - В любом другом случае результат должен быть возвращен целиком, независимо от
flag
значения.
-- This needs filtering:
SELECT data, flag FROM (...) src;
Ответ №1:
Странное требование, но оконные функции могут это сделать:
SELECT data, flag
FROM (SELECT data, flag,
count(*) OVER () AS c
FROM (SELECT ...) AS src
) AS q
WHERE NOT flag OR c <> 1;
Комментарии:
1. Спасибо за быстрый ответ. Похоже, что это довольно дорогостоящая проверка. При генерации плитки карты с помощью PostGIS с использованием нескольких ST_AsMVT создается одна строка (большой двоичный объект данных) для каждого слоя карты (вода, дороги, дома, точки доступа, …). Если плитка находится в океане, и в ней нет никаких данных, кроме самого океана (первый слой), и вода занимает всю плитку (
flag
), нет необходимости хранить плитку вообще.