CASE с IS NULL не заменяет, как ожидалось

0

У меня есть простая колонка с некоторыми номерами, которая выглядит;

133
8
55
11
NULL
NULL
235
NULL

Я хочу поставить значение по умолчанию при выборе этого столбца с целью замены нулей. Я сделал;

 CASE
        WHEN round(avg(s.seconds)) IS NULL THEN 0
        ELSE round(avg(s.seconds))

 END as 'seconds'

Однако мои значения остаются. Я ожидаю, что они будут установлены в 0. Почему это не работает?

  • 0
    Не уверены, что вы там делаете с AVG, но посмотрите на COALESCE - это, вероятно, решит ваши проблемы.
  • 0
    @Bing, COALESCE, кажется, возвращает первое ненулевое значение, я хочу заменить нулевые значения по умолчанию. Не уверен, подходит ли COALESCE для этой цели.
Показать ещё 4 комментария
Теги:

2 ответа

1

Значения NULL игнорируются при средних вычислениях.

Если вы хотите заменить значения NULL на 0 в среднем, вам необходимо использовать COALESCE для значений внутри средней функции. Пример:

DROP TEMPORARY TABLE IF EXISTS TEMP1;

CREATE TEMPORARY TABLE TEMP1
SELECT 1 AS price
UNION ALL SELECT NULL AS price
UNION ALL SELECT NULL AS price
UNION ALL SELECT 3 AS price;

SELECT * FROM TEMP1; # List values (1, NULL, NULL, 3)
SELECT AVG(price) FROM TEMP1; # Returns 2 (NULL values IGNORED)
SELECT AVG(COALESCE(price,0)) FROM TEMP1; # Returns 1 (NULL values REPLACED with 0)
  • 0
    Хорошее объяснение, но ваш код сбивает меня с толку.
0

Вы можете сделать это тремя способами

1

round(avg(CASE
               WHEN s.seconds IS NULL THEN 0
               ELSE s.seconds
           END)) as 'seconds'

2

Функция MySQL IFNULL() позволяет вернуть альтернативное значение, если выражение равно NULL:

round(avg(IFNULL(s.seconds,0)))

3

или мы можем использовать функцию COALESCE(), например:

 round(avg(COALESCE(s.seconds,0)))
  • 0
    Ни один из них, кажется, не работает. Я предполагаю, что что-то еще в полном запросе мешает. Мне придется копать немного больше.
  • 0
    Затем опубликуйте полный запрос или, по крайней мере, желаемый результат из предоставленных вами ограниченных образцов данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню