스노우보드 참 좋아하는데 맨날 키보드 앞에만 있네

[ORACLE] 조회된 ROW가 없을 때, RETURN 하는 방법 본문

개발/Oracle SQL

[ORACLE] 조회된 ROW가 없을 때, RETURN 하는 방법

워너-비 2019. 12. 18. 18:25

오라클 환경에서 조회되는 ROW가 없을 때, RETURN 하는 방법

( Return row if no data found in Oracle )


 

일반적으로 조회 시 조건절에 부합하는 데이터 ROW가 없을 경우에는 조회되지 않는다.

그러나 JOIN 등 특수한 경우로 조회되는 ROW가 없더라도 반환시켜야 하는 일이 생긴다.

 

특정 컬럼만 NULL 인 경우에는 NVL 함수를 이용하면 되지만,

-- NVL(COLUMN, 0) : COLUMN이 NULL 인 경우 0을 반환

ROW 전체가 조회되지 않을 경우에는 어떻게 처리해야 할까?

 


 

[방법 1] UNION 과 NOT EXISTS 의 활용

SELECT COLUMN_NAME
  FROM TABLE_NAME
 WHERE KEY_VALUE = :KEY

 UNION ALL

SELECT NULL AS COLUMN_NAME
  FROM DUAL
 WHERE NOT EXISTS ( SELECT COLUMN_NAME
                      FROM TABLE_NAME
                     WHERE KEY_VALUE = :KEY )

위 방법은 간단하고, 명료하다.

조건절로 조회되는 ROW의 유무에 따라 UNION 상단 혹은 하단의 쿼리 결과가 조회된다.

UNION 상단부의 조회 ROW가 없을 경우, 하단부에 ROW가 조회되므로 무조건 하나 이상의 ROW를 RETURN 한다.

 

위 방법으로 조회 시, 소요시간이 오래될 경우 아래의 방법을 사용한다.

 

 

[방법 2] UNION 과 ROWNUM 의 활용

SELECT *
  FROM ( SELECT COLUMN_NAME
           FROM TABLE_NAME
          WHERE KEY_VALUE = :KEY

          UNION ALL

         SELECT NULL AS COLUMN_NAME
           FROM DUAL )
 WHERE COLUMN_NAME IS NOT NULL OR ROWNUM = 1

UNION 사용은 동일하나, 방법 1에 비해 조회 시 태우는 총 INDEX가 더 적어 조회 시간이 조금 더 빠르다.

UNION 하단절의 조회결과는 NULL값 컬럼을 포함한 ROW로 UNION 상단이 NULL일때만 RETURN 된다.

 

 

[방법 3] GROUP 함수의 활용

SELECT MAX(COLUMN_NAME) COLUMN_NAME
  FROM TABLE_NAME
 WHERE KEY_VALUE = :KEY

조회 결과의 쓰임이 단일 ROW 거나 GROUP BY가 가능한 경우에는 GROUP 함수를 적극 활용한다.

MAX, MIN, SUM 등의 함수는 반환 ROW가 없을 경우에도 NULL을 반환한다.

 


 

끝.

Comments