21.09.23
@ NO DATA FOUND
Function을 쿼리문으로 녹여야만 하는 경우에 간혹 No Data Found를 Exception 처리해서 만들어 놓은 함수가 있다.
함수나 프로시져가 아닌 이상 해당 구문은 사용하지 못한다...
물론 NVL이나 Decode를 사용해서 Null 값을 대체하거나, Decode 안에 서브쿼리를 넣어서 해결할 수도 있지만,
아예 Data가 조회되지 않는 것은 Null 이 아닌데다, Decode로 서브쿼리 열심히 만들면 열심히 만든만큼 지저분하다..
물론 이것도 개인의 능력차이겠지만 나름의 깔끔한 방법을 찾았다.
@DUAL TABLE로 해결하기
SELECT * FROM DEPARTMENTS
WHERE ROWNUM<=10
ORDER BY DEPARTMENT_ID DESC
- 회사 Table을 회사번호를 기준으로 정렬했을 때 10개만 뽑아 냈다.
- 만일 내가 특정한 이유로 인해 192번인 사원을 뽑아내야 하는데, 만일 없다면 다른 Table을 조회해야한다고 해보자
- 해당 사원의 봉급과 회사 이름을 뽑아 내야한다
하지만
보는것 처럼 아예 조회되질 않는다. Null이라도 뜨면 뭐라도 더 쓸텐데 걍 안된다.
이때 Dual Table을 사용했다.
select a.salary,
nvl((select b.department_name from dual where b.department_id = '192'),
'Not Target')
as test
from employees a, departments b
where a.department_id = b.department_id
음.... 만들면서 깨달았는데 예시가 많이 잘못됐다....
무튼??...
이와 같이 Dual Table을 통해 Null 값을 뽑아내면 Decode를 쓰던 NVL을 쓰던 Case When을 쓰던해서
내가 원하는데로 쿼리문을 만들어나가는데
조금 덜 복잡하다.
이게 최선은 아니겠지만.... 쿼리문 줄이 한정없이 늘어나는것 보다는 이게 더 낫지 않을까 싶다...
결론은
"No Data Found의 처리에 있어 Dual Table을 사용하면 Null 값으로 처리되기 때문에 원하는 구문 사용 가능"
좀 더 공부하자!!
반응형
'끄적 > DB' 카테고리의 다른 글
[오라클] 데드락 확인 및 kill하기 (0) | 2022.05.20 |
---|---|
[DBeaver] 오라클11g 디비버에 연결하기 (0) | 2022.02.08 |
[Oracle] OVER() 와 PARTITION BY 사용하기 (0) | 2021.10.30 |
[Oracle] SQL로 간단한 Function 만들기 (0) | 2021.09.09 |
[Oracle] Oracle 11.g 시작하기(hr 계정 해금) / Group By (0) | 2021.09.07 |
댓글