SQL: Как отключить результат агрегата на пустой таблице? - PullRequest
0 голосов
/ 26 сентября 2018

При применении агрегатных функций SQL (COUNT, MAX и т. Д.) К пустой таблице я хотел бы получить пустой набор результатов (без строк), чтобы упростить обработку в ORM.

В настоящее время специальные возвращаемые значения (0 для COUNT, NULL для всех других агрегатов) возвращаются (при условии пустой таблицы user):

sqlite> SELECT COUNT(id) FROM user;
count(id)
0

Я знаю, что есть хитрость в использовании предложения GROUP BY plus HAVING для фильтрации пустых результатов, но это довольно громоздко, и я не уверен в производительности:

sqlite> SELECT COUNT(id) FROM user GROUP BY 1=1 HAVING COUNT(id) > 0;
sqlite>

Таким образом, вопросы:

  • Можно ли отключить агрегатные функции для возврата строки, если исходная таблица пуста?
  • Есть ли влияние на производительность использования предложения GROUP BY, которое имеет значение true для всех записей?

1 Ответ

0 голосов
/ 26 сентября 2018

Запрос агрегации SQL без group by возвращает одну строку.Это по определению .Так работает SQL.Обычно это считается хорошим делом и фактически улучшает работу приложений.

Например, легче проверить, что один столбец count, чем проверять count (если есть строки) ипроверка отсутствия строк (в других случаях).

В SQLite вы можете делать все, что хотите, добавив GROUP BY.Итак:

select . . . -- aggregation functions only
from . . .
group by null;

Это группировка по константе, которая функционально эквивалентна отсутствию group by, если нет строк.Эта версия возвращает пустой набор результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...