Подтвердить что ты не робот

SELECT SUM возвращает строку, когда нет записей

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

SQL> SELECT * FROM DUAL WHERE 1=2;

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

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


SQL>

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

4b9b3361

Ответ 1

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

select my_sum
from
(SELECT SUM(dummy) as my_sum FROM DUAL WHERE 1=2)
where
my_sum is not null

Ответ 2

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

Тогда do

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 (*) возвращает итоговую строку, если бы были только строки, для которых фиктивный элемент был нулевым, а последний - не был.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

SELECT COALESCE(SUM(where),0) FROM table WHERE condition = variable

Ответ 7

SELECT SUM(dummy) FROM DUAL GROUP BY 1 

Ответ 8

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

SELECT SUM(dummy), DATE_FORMAT(day, '%Y-%m') as month
FROM DUAL WHERE 1=2
GROUP BY month