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

Суммировать столбцы с нулевыми значениями в оракуле

Я хочу добавить два числа вместе, но когда одно из этих чисел равно null, тогда результат будет равен нулю. Есть ли способ обойти это. Я мог бы просто сделать это в коде, но я бы предпочел сделать это в запросе. Это база данных оракула. ​​

Структура таблицы

hours_t
type     craft    regular       overtime
 A         1        5              0
 A         1        3              1
 B         2        9            <null>
 B         1        4              4

Запрос

select type, craft, sum(regular + overtime) as total_hours
from hours_t
group by type, craft
order by type, craft

Нежелательные результаты

type   craft   total_hours
  A      1          9
  B      1          8
  B      2        <null>

Желаемые результаты

type    craft   total_hours
  A       1          9
  B       1          8
  B       2          9
4b9b3361

Ответ 1

select type, craft, sum(nvl(regular,0) + nvl(overtime,0)) as total_hours
from hours_t
group by type, craft
order by type, craft

Ответ 2

NVL (значение, значение по умолчанию) - это функция, которую вы ищете.

select type, craft, sum(NVL(regular, 0) + NVL(overtime, 0) ) as total_hours
from hours_t
group by type, craft
order by type, craft

Oracle имеет 5 функций, связанных с NULL:

  • NVL
  • NVL2
  • COALESCE
  • NULLIF
  • LNNVL

NVL:

NVL(expr1, expr2)

NVL позволяет вам заменить значение null (возвращаемое как пустое) строкой в ​​результатах запроса. Если expr1 является нулевым, NVL возвращает expr2. Если expr1 не является нулевым, то NVL возвращает expr1.

NVL2:

NVL2(expr1, expr2, expr3)

NVL2 позволяет определить значение, возвращаемое запросом, в зависимости от того, является ли указанное выражение нулевым или нет. Если expr1 не является нулевым, то NVL2 возвращает expr2. Если expr1 является нулевым, то NVL2 возвращает expr3.

COALESCE

COALESCE(expr1, expr2, ...)

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

NULLIF

NULLIF(expr1, expr2)

NULLIF сравнивает выражения expr1 и expr2. Если они равны, функция возвращает null. Если они не равны, функция возвращает expr1. Вы не можете указать литерал NULL для expr1.

LNNVL

LNNVL(condition)

LNNVL предоставляет сжатый способ оценки условия, когда один или оба операнда условия могут быть нулевыми.

Дополнительная информация о Oracle SQL-функции

Ответ 3

Другие ответы, касающиеся использования nvl(), верны, однако ни один из них не указывает на более важную точку:

Если у вас даже есть NULL в этом столбце?

Есть ли у них значение, отличное от 0?

Это похоже на случай, когда вы должны иметь NOT NULL DEFAULT 0 на ecolumn

Ответ 4

Самый верный ответ с NVL абсолютно прав. Если вы заинтересованы в том, чтобы сделать ваш код SQL более переносимым, вы можете использовать CASE, который поддерживается с тем же синтаксисом как в Oracle, так и в SQL Server:

select 
  type,craft,
  SUM(
    case when regular is null
         then 0
         else regular
    end
    +
    case when overtime is null
         then 0
         else overtime
    end
  ) as total_hours
from 
  hours_t
group by
  type
 ,craft
order by
  type
 ,craft

Ответ 5

Вам нужно использовать функцию NVL, например

SUM (NVL (обычный, 0) + NVL (сверхурочное время, 0))

Ответ 6

select type, craft, sum(NVL(regular, 0) + NVL(overtime, 0)) as total_hours
from hours_t
group by type, craft
order by type, craft

Ответ 7

код:

select type, craft, sum(coalesce( regular + overtime, regular, overtime)) as total_hours
from hours_t
group by type, craft
order by type, craft