안녕하세요 회원님들, 오라클 초보입니다^^;
일을 하다가 쿼리를 짜게 되었는데 궁금한 점이 있어 질문을 드립니다. 곰곰히 생각해봐도 잘 모르겠네요.
우선 쿼리는 다음과 같습니다.
(SELECT COUNT (*) COUNT
FROM offerings_mst a
WHERE agency_cd = '88888'
AND status_gbn IN ('R', 'Y')
AND display_reg_date >=
(CASE
WHEN a.offerings_gbn IN ('AT', 'BU', 'JU', 'JB', 'OP', 'OB', 'RB', 'SH', 'CH', 'OR', 'OT')
THEN SYSDATE - 60
WHEN a.offerings_gbn IN ('RD', 'RH', 'ST', 'SR', 'OF', 'BD', 'LI', 'FA', 'AF', 'WH', 'CO', 'SB', 'EX', 'ET')
THEN SYSDATE - 180
END))
오라클 쿼리이며 서브 쿼리로 들어갈 부분입니다.
설명을 간략히 드리자면 agency_cd = (회원pk), status_gbn = (구분자), display_reg_date (회원당 언제부터 ~ 언제까지 기간의 내용들만 보여줄 것인지) 를 정해 놓은 것인데,
여기서 제가 해야 될 것은, 바로 저기 조건식의 값이 존재하면 (즉, 카운트가 0이 아니면)
"is_exist_maemul" 이라는 이름(별칭)으로 "Y"를 뽑아주고, 반대로 존재하지 않으면( 카운트가 0 이면) 똑같은 별칭으로
"N"을 뽑아 주는 것입니다.
곰곰히 생각해보고 이것저것 해봐도 어떻게 해야할지 감이 안잡히네요.
회원님들의 통쾌한 답변과 설명 부탁드립니다!
감사합니다.
조건절에 CASE 사용 하셨듯이.. Select 절에서도 Case 사용하시면 됩니다.
SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END AS is_exist_maemul
SELECT DECODE(COUNT(*), 0, 'N', 'Y') AS is_exist_maemul
단, 모두 다 카운트 한 뒤에 체크하는 것은 비효율입니다.
1건이 존재하건 100만건이 존재하건 결과는 똑같이 Y 입니다.
1건의 존재만 확인되면 나머진 읽을 필요 없이 'Y' 를 리턴하고 끝내는게 효율적이죠.
조건절에 ROWNUM 조건을 추가하어 1건만 읽고 끝내도록 하세요.
AND ROWNUM <= 1