포스팅 목차
* 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
[ NVL2 함수 Oracle Function ]
NVL2 함수는 expr1이 NULL이 아니라면 expr2를 반환하고 NULL이면 expr3을 반환하는 함수이다. NVL2함수를 사용하면, 지정한 표현이 NULL인지 판단 여부에 근거하여 쿼리에 반환하는 값(expr2 or expr3)을 판단할 수 있다. 만약 expr1이 NULL이 아니라면, NVL2는 expr2를 반환한다. 만약 expr1인 NULL이라면, NVL2는 expr3을 반환한다.
- 함수 설명 : NVL2 오라클 함수 링크
- NVL함수 참조
- 좀 더 다양한 방식은 NULLIF 함수 참조
1. Oracle(오라클)
NVL2 함수
| Oracle Programming |
SELECT ENAME, SAL,
NVL2(COMM, SAL + (SAL * COMM), SAL) income
FROM EMP
WHERE ENAME like 'B%'
ORDER BY ENAME;
| Results |
ENAME SAL INCOME
-------------------------
BLAKE 2850 2850
2. Python Pandas(파이썬)
np.where 구문
수수료(comm)의 값이 존재하지 않으면 급여를 반환하고, 수수료(comm)의 값이 존재하는 경우에는 급여+수수료의 값을 반환한다.
| Python Programming |
withmooc = copy.copy(emp)
withmooc['comm_nvl2'] = np.where(withmooc['comm'].isnull(), withmooc['sal'], withmooc['sal']+withmooc['comm'])
withmooc.head()
| Results |
empno ename job mgr hiredate sal comm deptno comm_nvl2
0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20 800.0
1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30 1900.0
2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30 1750.0
3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20 2975.0
4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30 2650.0
3. R Programming (R Package)
ifelse 구문
| R Programming |
%%R
withmooc<-emp
withmooc['comm_nvl2'] = ifelse(is.na(withmooc$comm),withmooc$sal,withmooc$sal + withmooc$comm)
withmooc[1:10, ]
| Results |
# A tibble: 10 x 9
empno ename job mgr hiredate sal comm deptno comm_nvl2
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl> <dbl>
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 800
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 1900
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 1750
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 2975
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 2650
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 2850
7 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10 2450
8 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20 3000
9 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10 5000
10 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 1500
4. R Dplyr Package
ifelse()
| R Programming |
%%R
emp %>%
dplyr::mutate(comm_nvl2 = ifelse(is.na(comm),sal,sal + comm)) %>%
head()
| Results |
# A tibble: 6 x 9
empno ename job mgr hiredate sal comm deptno comm_nvl2
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl> <dbl>
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 800
2 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 1900
3 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 1750
4 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 2975
5 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 2650
6 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 2850
5. R sqldf Package
case when 구문
| R Programming |
%%R
sqldf(" SELECT ename,comm,
sal + comm tot_sal,
case when comm is null then sal else sal + comm end comm_nvl2
FROM emp ")
| Results |
ename comm tot_sal comm_nvl2
1 SMITH NA NA 800
2 ALLEN 300 1900 1900
3 WARD 500 1750 1750
4 JONES NA NA 2975
5 MARTIN 1400 2650 2650
6 BLAKE NA NA 2850
7 CLARK NA NA 2450
8 SCOTT NA NA 3000
9 KING NA NA 5000
10 TURNER 0 1500 1500
11 ADAMS NA NA 1100
12 JAMES NA NA 950
13 FORD NA NA 3000
14 MILLER NA NA 1300
6. Python pandasql Package
case when 구문
| Python Programming |
ps.sqldf(" SELECT ename,comm, \
sal + comm tot_sal, \
case when comm is null then sal else sal + comm end comm_nvl2 \
FROM emp ").head()
| Results |
ename comm tot_sal comm_nvl2
0 SMITH NaN NaN 800.0
1 ALLEN 300.0 1900.0 1900.0
2 WARD 500.0 1750.0 1750.0
3 JONES NaN NaN 2975.0
4 MARTIN 1400.0 2650.0 2650.0
7. R data.table Package
ifelse()
| R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
DT[, comm_nvl2 := ifelse(is.na(comm),sal,sal + comm)][1:10, ]
| Results |
empno ename job mgr hiredate sal comm deptno comm_nvl2
1: 7369 SMITH CLERK 7902 1980-12-17 800 NA 20 800
2: 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 1900
3: 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 1750
4: 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 2975
5: 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 2650
6: 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30 2850
7: 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10 2450
8: 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20 3000
9: 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10 5000
10: 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 1500
8. Python Duckdb의 SQL
CASE WHEN 구문
| Python Programming |
%%sql
SELECT ename,comm,
sal + comm tot_sal,
case when comm is null then sal else sal + comm end comm_nvl2
FROM emp
LIMIT 6
| Python Programming |
duckdb.sql(" SELECT ename,comm, \
sal + comm tot_sal, \
case when comm is null then sal else sal + comm end comm_nvl2 \
FROM emp \
LIMIT 6 ").df()
| Results |
ename comm tot_sal comm_nvl2
0 SMITH NaN NaN 800.0
1 ALLEN 300.0 1900.0 1900.0
2 WARD 500.0 1750.0 1750.0
3 JONES NaN NaN 2975.0
4 MARTIN 1400.0 2650.0 2650.0
5 BLAKE NaN NaN 2850.0

--------------------------------------------
| [Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table] 오라클 함수와 R & Python 비교 사전 목록 링크 |
| 오라클 SQL 함수(Oracle SQL Function) 목록 리스트 링크 |
| [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트 링크 링크 |
반응형
댓글