본문 바로가기

배우기/복습노트[oracle sql]

[복습] SQL | Oracle null값 관련 함수인 일반함수(nvl, nvl2) + 복습후기(20231030)

728x90
반응형

일반함수 중 nvl 함수가 있다.

이는 null치환 함수로, nvl(대상, null치환값) 형태로 사용된다.

null 치환값은 데이터 타입이 문자일 경우 문자, 숫자인 경우 숫자, 날짜인 경우 날짜이다.

즉, 대상과 null 치환값의 데이터 타입은 일치하는 것이 좋다.

 

참고로 null의 경우 문자의 null보다 숫자의 null이 더 위험하다. 숫자 null이 포함된 산수의 계산은 null이 리턴되므로 사전에 null이 포함되어 있는지, null로 인해 연산 결과가 잘못된 것은 없는지 꼭 확인하여야 한다.

이렇게 위의 테스트를 확인해보면 알 수 있듯이 sal+comm(null포함)은 null이 출력되므로

comm에 nvl 함수를 씌워 결과를 도출하면 된다.

 

즉 이런 문법은 불가하며 null값에 꼭 X를 넣고싶다면 아래와 같이 to_char를 이용하여 쿼리를 작성하면 된다.

두 데이터 타입을 일치시켜주니 위와 같은 결과가 출력되었다.

 

그런데 다음과 같은 형태는 오류 없이 출력이 된다. 왜 그럴까?

묵시적 형변환이 일어났기 때문이다.

문자가 숫자를 포함할 수 있기 때문에 이러한 결과가 도출된 것이다.

그렇기 때문에 위에서 nvl 데이터 타입은 hpage에 영향을 받으므로 0이 출력 가능하게 된 것이다.

즉 가능한 이유는 hpage가 문자 컬럼이므로 nvl 결과가 문자타입을 리턴한다.

문자 컬럼에는 숫자 입력이 가능하나 그 반대는 불가하다.

SQL은 성능과 직결되는 언어이기 때문에 이런 세세한 부분까지 기억하여야 한다.

정리하자면 리턴 데이터 타입은 대상이 갖는 타입에 의하여 결정된다.

 

 

다음 함수는  nvl2 다. 

꼭  nvl의 version2 같다. nvl2는 nvl의 확장형 함수이다. null치환 함수라고도 한다.

 nvl2(대상, 치환1, 치환2) 형식으로 사용한다.

치환1은 null이 아닐 때 치환값, 치환2는 null일때 치환값이 되겠다.

 

마지막 예제를 풀어보자.

 

emp 에서 각 직원의 급여, comm 출력하여라. 단 comm이 null이면 500을 부여 comm이 정해져 있는 경우 10% 인상한다.

대상은 null 여부만 확인되고, 치환1과 치환2로 데이터가 구성되므로 치환1과 치환2가 데이터 타입이 일치하여야 한다.

 

위와 같은 형식은 가능하다. comm은 문자 타입이 아니지만 치환1 = 치환2 과 같이 데이터 타입이 같으니 가능한 것이다.

 

그런데,

이것도 가능하다. 

위에서 설명하였듯이 문자 데이터 타입이 더 크기 때문에 숫자를 포함하기 때문이다.

 

그러나

이는 아무것도 출력되지 않는다. 치환 1의 데이터 타입에 의해 리턴 데이터 타입이 결정되기 때문에 세 번째 인수에 문자가 들어갈 경우는 불가능하다.

 

 

복습 후기

벌써 자정이 넘었다. 대충 어림잡건데 복습하는데에 4시간 가까이 소요되는 것 같다.

그래도 직접 다시 코드 넣어보고 문제 풀어보면서 하면 기억에 잘 남을 거라 믿으면서 계속 이렇게 진행해보아야겠다.

작성한 블로그 글 가지고 공부할 때, 수업할 때 필기본 역할을 잘 해내는 것 같아 다행이다.

좀 더 효과적인 복습 방법은 없을지 고민된다.

버스에서도 블로그에 적은 글을 읽으며 가고 싶은데 폰으로 보는 건 너무 작고 아이패드는 인터넷 연결이 되지 않는다.

내일 버스 공공 와이파이가 있는지 확인해봐야겠다.

일단 굿밤.

 

728x90
반응형