Ответ 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
Я хочу добавить два числа вместе, но когда одно из этих чисел равно 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
select type, craft, sum(nvl(regular,0) + nvl(overtime,0)) as total_hours
from hours_t
group by type, craft
order by type, craft
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:
NVL(expr1, expr2)
NVL позволяет вам заменить значение null (возвращаемое как пустое) строкой в результатах запроса. Если expr1 является нулевым, NVL возвращает expr2. Если expr1 не является нулевым, то NVL возвращает expr1.
NVL2:
NVL2(expr1, expr2, expr3)
NVL2 позволяет определить значение, возвращаемое запросом, в зависимости от того, является ли указанное выражение нулевым или нет. Если expr1 не является нулевым, то NVL2 возвращает expr2. Если expr1 является нулевым, то NVL2 возвращает expr3.
COALESCE(expr1, expr2, ...)
COALESCE возвращает первое ненулевое выражение в списке выражений. По крайней мере один expr не должен быть буквальным NULL. Если все вхождения expr имеют значение null, то функция возвращает null.
NULLIF(expr1, expr2)
NULLIF сравнивает выражения expr1 и expr2. Если они равны, функция возвращает null. Если они не равны, функция возвращает expr1. Вы не можете указать литерал NULL для expr1.
LNNVL(condition)
LNNVL предоставляет сжатый способ оценки условия, когда один или оба операнда условия могут быть нулевыми.
Дополнительная информация о Oracle SQL-функции
Другие ответы, касающиеся использования nvl(), верны, однако ни один из них не указывает на более важную точку:
Если у вас даже есть NULL в этом столбце?
Есть ли у них значение, отличное от 0?
Это похоже на случай, когда вы должны иметь NOT NULL DEFAULT 0 на ecolumn
Самый верный ответ с 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
Вам нужно использовать функцию NVL, например
SUM (NVL (обычный, 0) + NVL (сверхурочное время, 0))
select type, craft, sum(NVL(regular, 0) + NVL(overtime, 0)) as total_hours
from hours_t
group by type, craft
order by type, craft
код:
select type, craft, sum(coalesce( regular + overtime, regular, overtime)) as total_hours
from hours_t
group by type, craft
order by type, craft