본문 바로가기

Database/Oracle

[Oracle] 특정 테이블에 데이터가 없을 시 기본값 출력하기

DB쿼리를 짤때 값이 없을 경우에는 디폴트 값을 보여줘야하는 시나리오가 종종 나오게 된다.

그럴경우에 한번에 초기 테이블을 만들때 다음과 같은 방법으로 해볼 수 있다.

 

아래의 테이블 내용은 STR_ID 별로 물품 카테고리와 물품들 리스트를 보관하는 테이블의 데이터 모습이다.

여기서 특정 STD_ID에 해당하는 카테고리/물품 내용이 저장되어 있지 않을 경우 디폴트 STR_ID = 0인 값들로 무언가 해보고자 한다면 과연 어떻게 초기 테이블을 가져갈 수 있을까?

 

UNION ALL을 활용해 값이 없을때의 STR_ID = 0 인 조회결과와 실제 원하는 값이 있을때의 테이블 결과를 UNION ALL 하면 위 시나리오 대로 실행을 해볼 수 있다.

 

아래와 같이 조회를 원하고자 하는 STR_ID = 3에 해당하는 값이 없을 경우에 다음과 같이 서브쿼리를 만들고

 

    SELECT *
    FROM QUEUE_PRODUCT_INFO QI 
    WHERE QI.STR_ID = 0 AND NOT EXISTS (
        SELECT *
        FROM QUEUE_PRODUCT_INFO QA
        WHERE QA.STR_ID = 3
    )

 

여기에 실제 매장의 쿼리 결과

 

    SELECT *
    FROM QUEUE_PRODUCT_INFO QA
    WHERE QA.STR_ID = 3

 

위 둘을 UNION ALL로 붙여 주는것이다.

 

아래결과는 존재하는 STR_ID = 3에 대해서 조회를 해본것이다.

WITH CATEGORY_TEMPLATE AS (
    SELECT *
    FROM QUEUE_PRODUCT_INFO QI 
    WHERE QI.STR_ID = 0 AND NOT EXISTS (
        SELECT *
        FROM QUEUE_PRODUCT_INFO QA
        WHERE QA.STR_ID = 3
    )
    UNION ALL
    SELECT *
    FROM QUEUE_PRODUCT_INFO QA
    WHERE QA.STR_ID = 3
)
SELECT *
FROM CATEGORY_TEMPLATE

 

3번 내용이 존재하므로 아래와 같이 STR_ID = 3에 대한 내용만 출력이 된다.

 

이제 본 문서의 목적인 현재 존재하지 않는 값에 대해서 디폴트 템플릿을 출력하는것을 확인하기 위해 아래와 같이 100번 STR_ID를 쿼리에 넣어본다. 

WITH CATEGORY_TEMPLATE AS (
    select *
    from queue_product_info qi 
    where qi.str_id = 0 and not exists (
        select *
        from queue_product_info qa
        where qa.str_Id = 100
    )
    UNION ALL
    select *
    from queue_product_info qa
    where qa.str_Id = 100
)
SELECT *
FROM CATEGORY_TEMPLATE

 

아래와 같이 없는 경우에는 STR_ID = 0 에 해당하는 내용이 나오게 된다.

 

요청 항목에 대해서 값이 있는 경우는 그 값을 쓰고 없을 경우 디폴트 템플릿을 써야하는 패턴이라면 위와 같이 손쉽게 쿼리로 구성해볼 수 있다.

 

-- The End --