Отфильтровывает результат SQL, когда все строки соответствуют условию

#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 ), нет необходимости хранить плитку вообще.