본문 바로가기
My Image
프로그래밍/DataBase

[DataBase] 조건절에 특정 컬럼 값이 NULL이면 해당 테이블 전체조회, 컬럼 값이 있으면 테이블 조건 조회

by Lim-Ky 2018. 6. 29.
반응형



조건절에 특정 컬럼 값이 NULL이면 해당 테이블 전체조회, 컬럼 값이 있으면 테이블 조건 조회



안녕하세요. Limky 입니다.


이번시간에는 데이터베이스 조회에서 조건절의 특정 값이 NULL 이면 해당 테이블을 전체 조회하고, 조건절의 특정 값이 있는 경우 해당 값을에 해당하는 레코드만 조회하는 SQL 쿼리문에 대해 알아보겠습니다.


들어가기 앞서 왜 이렇게 쿼리를 짜야할 필요가 있을까요??


그 이유는 2트랙으로 조회문을 만들지 않고, INPUT 값에 따라 하나의 쿼리문으로 2개의 동작을 취하여 다양한 이점을 얻기 위해서입니다.


그렇다면, 어떤 이점이 있을까요? 네 방금 말했습니다. 굳이 2트랙으로 만들지 않아도 됩니다. 또한, INPUT값만 제어하면 되기 때문에 심플합니다. 뿐만 아니라 개발시간이 단축됩니다.


자, 다시한번 이점에 대해 정리해보면 다음과 같습니다.


1. 개발량을 줄일 수 있습니다.

2. INPUT 값만 제어하면 되기 때문에 간단합니다.

3. 개발 시간을 단축할 수 있습니다.


우선 아래와 같은 쿼리문을 던져봅시다.


SELECT *

FROM EMP


위와 같이 EMP 테이블을 전체조회하면 총 14건의 레코드가 결과로 리턴됩니다. 



그다음  MGR 컬럼이 7902 인 경우만 조회해봅시다.


SELECT *

FROM EMP

WHERE MGR = '7902'



위처럼 2가지의 조회 기능을 구현하기 위해서 각각 조회문을 짜고, 이를 바인딩 하는 DAO를 짜고, DAO를 타는 SERVICE 그리고 컨트롤러 등 을 각각 구현하여 2트랙을 가져가면, 개발량이 많아지게 됩니다. 따라서 각각 구현하지 않고 하나의 쿼리에서 2가지 조회기능할 수 있도록 짜보겠습니다.


SELECT *

FROM EMP

WHERE MGR LIKE DECODE(:mgr, NULL, '%', :mgr);


위와 같이 조회문을 짜면, :mgr에 값에 따라 조회를 다르게 하게 됩니다.


:mgr 이란 MGR 컬럼에 대한 파라미터 변수라고 생각하시면 됩니다.

:mgr 파라미터의 값이 '' 아무것도 없이 들어오면, DECODE에 의해서 NULL 이면 '%' 해당 문자열을 조회합니다. 즉 모든 문자열을 조회하기 때문에 전체조회 를 하게 됩니다. 

만약 :mgr 에 특정 값이 있다면, DECODE에 의해서 :mgr이 NULL이 아니기 때문에 그대로 :mgr 을 반환합니다. 따라서 MGR LIKE :mgr 이 되어 특정값에 레코드만 조회하게 됩니다.


위 쿼리문을 실행하면 다음과 같습니다. 


DBMS로 토드를 사용하면 아래와 같은 파라미터 입력 창이 뜹니다. 아무것도 주지 않고 실행해보겠습니다. (즉 전체조회를 함)



전체조회를 하는 것을 알 수 있습니다.(단, MGR이 NULL인 경우 결과값에서 제외)





다음으로 특정값을 :mgr 파라미터에 입력하고 실행해보겠습니다.




MGR이 7902 인 레코드 값을 조회함을 알 수 있습니다.





끝으로... MGR이 NULL인 경우도 전체조회시 결과값에 포함시키려면 다음과 같이 쿼리문을 수정하면 됩니다.


SELECT *

FROM EMP

WHERE NVL(MGR, 1) LIKE DECODE(:mgr, NULL, '%', :mgr)


MGR이 NULL인경우 1로 반환됩니다. 결국 WHERE 1 LIKE '%' 이기 때문에 항상 참으로 MGR이 NULL이여도 결과값에 포함되어 테이블의 모든 데이터를 반환하게 됩니다.




MGR 이 NULL인 경우도 포함되어 총 14건 데이터가 조회되었습니다.




이상으로.. 조건절에 특정 컬럼 값이 NULL이면 해당 테이블 전체조회, 컬럼 값이 있으면 테이블 조건 조회할 수 있는 방법에 대해 알아보았습니다.











반응형

댓글