SELECT SUM возвращает строку, когда нет записей - PullRequest
12 голосов
/ 13 марта 2010

Я обнаружил некоторые проблемы с запросом, который возвращает сумму поля из таблицы для всех записей, которые удовлетворяют определенным условиям. Я ожидал получить «Записи не найдены», когда не было записей, но вместо этого я получаю нулевой результат.

SQL> SELECT * FROM DUAL WHERE 1=2;

no rows selected
SQL> SELECT SUM(dummy) FROM DUAL WHERE 1=2;

SUM(DUMMY)
----------


SQL>

Можно ли в этом случае не получать никаких записей?

Ответы [ 8 ]

18 голосов
/ 13 марта 2010

«Я ожидал получить« Записи не найдены », когда не было записей, но вместо этого я получаю нулевой результат».

Тогда сделай

SELECT SUM(dummy) FROM DUAL WHERE 1=2 HAVING COUNT(*) > 0

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

SELECT SUM(dummy) FROM DUAL WHERE 1=2 HAVING SUM(dummy) IS NOT NULL

аналогично, но COUNT (*) вернул бы итоговую строку, если бы были только строки, для которых фиктивный элемент был нулевым, а последний - нет.

5 голосов
/ 13 марта 2010

Как насчет этого:

select my_sum
from
(SELECT SUM(dummy) as my_sum FROM DUAL WHERE 1=2)
where
my_sum is not null
1 голос
/ 23 ноября 2017
SELECT SUM(dummy) FROM DUAL GROUP BY 1 
1 голос
/ 18 сентября 2012

используйте функцию объединения в mysql и выполните:

SELECT COALESCE(SUM(where),0) FROM table WHERE condition = variable
1 голос
/ 01 января 2012

Сумма нулевых чисел равна 0 (это математика). Таким образом, было бы естественно, чтобы select sum (что-то) возвращало 0, если нет записей для суммирования, аналогично для select count (*), который должен вернуть 0, если count равен 0 (нет записей, удовлетворяющих сказуемое). Конечно, в идеальном мире.

1 голос
/ 13 марта 2010

Нет - это поведение в соответствии с дизайном используемой здесь СУБД, которое, по крайней мере для меня, имеет смысл, поскольку вы ищете сумму, а не необработанные данные

1 голос
/ 13 марта 2010

Вы можете отфильтровать результаты null с помощью having

SELECT SUM(dummy) FROM DUAL WHERE 1=2 HAVING SUM(dummy) IS NOT NULL
0 голосов
/ 13 июля 2016

Вы можете группировать по другой метрике. Например, месяц, а затем sql также возвращает 0 строк:

SELECT SUM(dummy), DATE_FORMAT(day, '%Y-%m') as month
FROM DUAL WHERE 1=2
GROUP BY month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...