오라클에 null 값이 있는 열 합계
저는 두 개의 숫자를 함께 추가하고 싶지만 그 숫자 중 하나가 null이면 결과는 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
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
- 연합체
- NULLIF
- LNNVL
NVL:
NVL(expr1, expr2)
NVL을 사용하면 쿼리 결과에서 null(공백으로 반환됨)을 문자열로 바꿀 수 있습니다.expr1이 null이면 NVL이 expr2를 반환합니다.expr1이 null이 아닌 경우 NVL은 expr1을 반환합니다.
NVL2:
NVL2(expr1, expr2, expr3)
NVL2를 사용하면 지정된 식이 null인지 여부에 따라 쿼리에서 반환되는 값을 확인할 수 있습니다.expr1이 null이 아닌 경우 NVL2는 expr2를 반환합니다.expr1이 null이면 NVL2가 expr3을 반환합니다.
COALESCE(expr1, expr2, ...)
COALESCE는 식 목록에서 null이 아닌 첫 번째 expr을 반환합니다.적어도 하나의 expr은 문자 그대로 NULL이 아니어야 합니다.모든 expression 값이 null로 계산되면 함수는 null을 반환합니다.
NULLIF(expr1, expr2)
NULLIF는 expr1과 expr2를 비교합니다.이 값이 같으면 함수는 null을 반환합니다.동일하지 않으면 함수는 expr1을 반환합니다.expr1에 리터럴 NULL을 지정할 수 없습니다.
LNNVL(condition)
LNNVL은 조건의 하나 또는 두 피연산자가 모두 null일 수 있는 경우 조건을 평가하는 간결한 방법을 제공합니다.
Oracle SQL 함수에 대한 추가 정보
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()의 사용과 관련된 다른 답변은 정확하지만 어느 것도 더 중요한 점을 다루지 않는 것 같습니다.
이 열에 NULL이 있어야 합니까?
그들은 0이 아닌 다른 의미를 가지고 있습니까?
이것은 열에 NULL DEFAULT 0이 아닌 경우처럼 보입니다.
NVL을 사용한 최고 등급의 답변은 완전히 유효합니다.SQL 코드를 보다 쉽게 이동할 수 있도록 하려면 Oracle 및 SQL Server 모두에서 동일한 구문으로 지원되는 CASE를 사용하는 것이 좋습니다.
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(column_name))도 필요합니다.시나리오를 고려해 보는 것이 좋습니다.
예를 들어 특정 조건에 따라 특정 테이블에서 특정 열의 합계를 가져오려고 합니다.그 조건들을 근거로 볼 때,
- 테이블에 하나 이상의 행이 있습니다.이 경우 저는 합계를 원합니다.
- 행이 존재하지 않습니다.이 경우 저는 0을 원합니다.
여기서 sum(suml(column_name,0))을 사용하면 null이 됩니다.원하는 것은 nvl(sum(column_name)), 0입니다.
이 결과를 Java 등에 전달할 때는 특수한 null 처리가 필요하지 않기 때문에 데이터 유형을 번호로 지정해야 합니다.
예를 들어 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
그룹 제외 기준SUM(NVL(regular, 0) + NVL(overtime, 0))
오류를 던질 것이고 이것을 피하기 위해 우리는 간단히 사용할 수 있습니다.NVL(regular, 0) + NVL(overtime, 0)
언급URL : https://stackoverflow.com/questions/590551/sum-columns-with-null-values-in-oracle
'programing' 카테고리의 다른 글
ASP.Net에서 상태 코드 500을 보내고 응답에 쓰는 방법은 무엇입니까? (0) | 2023.06.17 |
---|---|
문자열을 snake_case에서 Ruby의 CamelCase로 변환하는 중 (0) | 2023.06.17 |
Oracle SQL*Plus에서 LOB 열의 전체 내용을 표시하는 방법은 무엇입니까? (0) | 2023.06.17 |
Typescript/JSX with React에서 화살표 기능이 있는 제네릭을 사용하는 방법은 무엇입니까? (0) | 2023.06.17 |
파이썬 그룹 기준 (0) | 2023.06.17 |