Суммируйте столбцы с нулевыми значениями в oracle - PullRequest
25 голосов
/ 26 февраля 2009

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

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

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

Ответы [ 8 ]

49 голосов
/ 26 февраля 2009

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:

  1. NVL
  2. NVL2
  3. COALESCE
  4. NULLIF
  5. 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 в списке выражений. По крайней мере, один expr не должен быть буквальным NULL. Если все вхождения expr имеют значение null, то функция возвращает null.

NULLIF

NULLIF(expr1, expr2)

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

LNNVL

LNNVL(condition)

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

Подробнее о Функции Oracle SQL

47 голосов
/ 26 февраля 2009
select type, craft, sum(nvl(regular,0) + nvl(overtime,0)) as total_hours
from hours_t
group by type, craft
order by type, craft
9 голосов
/ 26 февраля 2009

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

Должны ли вы даже иметь NULL в этом столбце?

Имеют ли они значение, отличное от 0?

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

4 голосов
/ 26 февраля 2009

Лучший ответ с 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
1 голос
/ 26 февраля 2009

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

СУММА (NVL (обычный, 0) + NVL (сверхурочные, 0))

0 голосов
/ 08 мая 2018

В некоторых случаях также требуется nvl (sum (column_name), 0). Вы можете рассмотреть ваши сценарии.

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

  1. одна или несколько строк существуют в таблице. В этом случае я хочу сумму.
  2. строк не существует. В этом случае я хочу 0.

Если вы используете здесь сумму (nvl (column_name, 0)), это даст вам нулевое значение. То, что вы можете захотеть, это nvl (sum (column_name), 0).

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

0 голосов
/ 25 февраля 2015

Код:

select type, craft, sum(coalesce( regular + overtime, regular, overtime)) as total_hours
from hours_t
group by type, craft
order by type, craft
0 голосов
/ 26 февраля 2009
select type, craft, sum(NVL(regular, 0) + NVL(overtime, 0)) as total_hours
from hours_t
group by type, craft
order by type, craft
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...